1. 程式人生 > >IO重定向&管道&元字符

IO重定向&管道&元字符

io重定向 set 管道

一、glob及IO重定向

bash基礎特性:命令補全,路徑補全,命令引用

1.bash的其他特性

globbing:文件名統配

動態角度:運行中的內核,在內核之上,由內核支配負責管控的文件系統

靜態:內核自己其實也是文件系統上的一個文件而已

2.元字符

匹配模式:元字符:

*:匹配任意長度的任意字符

*pa* 包含pa

pa* pa開頭

*pa pa結尾,

?:匹配任意單個字符

[]:匹配指定範圍內的任意單個字符

有幾種特殊格式:

[a-z],[A-Z],[0-9],[a-z0-9]

[abcxyz] //有一個

//指定範圍的時候,是不區分文件名大小寫

ls 進行測試命令

[[:upper:]] 所有大寫字母

[[:lower:]] 所有小寫字母

[[:alpha:]] 所有字母

[[:digit:]] 所有數字

[[:alnum:]] 所有的字母和數字

[[:space:]] 所有空白字符

[[:punct:]] 所有標點字符

! 取反

touch a\ b //創建a b包含特殊字符,空格

[^] 匹配指定範圍外的任意單個字符

[^[:upper:]] //非大寫

[^0-9] 非數字

ls -d /tmp/test 匹配目錄和文件,而不是目錄的內容

ls -d /etc/n*[^0-9] //匹配都的文件和目錄都會顯示

-d 文件或者目錄

*,?,[],!,^

ls -d

3.IO重定向及管道

程序:指令+數據

程序也有IO

可用輸入的設備:文件

鍵盤設備、文件系統上的常規文件、網卡等

可用的輸出設備:文件

顯示器、文件系統上的常規文件、網卡等

程序的數據流有三種:

輸入數據流:< -- 標準輸入(stdin)

默認的額標準輸入時鍵盤

輸出的數據流:-->標準輸出(stdout),顯示器

錯誤輸出數據流:--->標準輸出(stderr),顯示器

fd:filedescriptor,文件描述符

標準輸入:0

標準輸出:1

錯誤輸出:2

IO重定向

輸出重定向:>

cat /etc/issue > /dev/tty1 //直接輸出到該用戶界面

echo ,ls 也可以實現,追加到設備

cat /etc/issue > /dev/sda //直接就會損壞硬盤

特性:

覆蓋輸出

輸出重定向:>>

特性:追加輸出

4.IO重定向相關命令

特別危險,於是建議使用set

set:設置和撤銷,shell選項的值和位置選項

type set:bash的內建命令

-C 禁止通過輸出重定向,覆蓋一個已經存在的文件

//不存在的文件,覆蓋是可以的,追加已經存在的文件也是可以的

set -C 啟用該功能

echo "hhh" > /tmp/a //出錯,條件a已經存在

echo "hhh" >> /tmp/a //可以追加

//假如只想覆蓋一次,可以強制覆蓋輸出

cat /etc/issue >| /tmp/a

set +C //關閉該特性

set -C //僅對當前shell起作用

5.錯誤輸出流重定向

2> 錯誤覆蓋輸出重定向 only

2>> 錯誤追加輸出重定向 only

合並正確和錯誤輸出流

&>

&>>

COMMAND > /path/to/somefile 2>&1 合並為正確的,覆蓋

COMMAND >> /path/to/somefile 2>>&1 合並為正確的,追加

1> 標準信息輸出路徑 //ls /home 1> aa 覆蓋到aa,和

//一般1> 可以省略不寫

2> 錯誤信息輸出路徑

2>&1 錯誤和正確的都輸出到

&是與的意思

正確輸出和錯誤輸出的轉換

cat /etc/rc.d/init.d/function >> /tmp/aa 2>&1

function 是不存在的

如果是正常的:輸出到aa中 // >> 只接受正確的

如果是錯誤的,轉換為正確的的輸出,然後追加到aa // 2>只接受錯誤的

6.輸入重定向

cat < /etc/fstab //和cat /etc/fstab 一樣

cat

tr [OPTION]... SET1 [SET2]

把輸入的數據當中的字符,凡是在SET1定義範圍內出現的,

tr [a-z] [A-Z]

//把出現在第一個集合中的字符,對位轉換為對應字符

tr [a-z] [A-Z] < /etc/issue

tr -d ‘[A-Z]‘ < /etc/issue

tr -d ‘[[:upper:]] < /etc/issue

tr -d ‘abc‘ < /etc/issue

-d 刪除 //只是輸出到屏幕不顯示而已

<< :兩個小於號,Here Document

cat << EOF //打包輸出

cat > /tmp/a.out << END //輸入重定向,創建文件

7.管道

連接程序,將前一個命令的輸出直接定向後一個程序當做輸入

COMMAND | COMMAND | COMMAND | ...

cat /etc/issue | tr ‘a-z‘ ‘A-Z‘

cat自己的輸出將不可見,因為他把結果交給了tr

解決方法:

tee:讀取標準輸入,寫到標準輸出以及文件

cat /etc/issue | tee a.tee | tr ‘a-z‘ ‘A-Z‘

tee 將數據流,

一份:保存到a.tee中

一份:送給tr

8.小結:

元字符:*,?,[],^,!,\轉義

ls -d

[[::]] upper,lower,alpha,digit,alnum,punct,space

IO重定向:

程序的數據流:

標準輸入流:0:stdin

標準輸出流:1:stout

錯誤輸出流:2:sterr

echo “hello world ” 》》 /dev/pts/1

重定向:

輸出重定向:> >>

輸入重定向:< <<

錯誤輸出重定向:2> 2>>

建議使用set

set -C //禁止通過輸出重定向覆蓋一個已經存在的文件

>| 強制覆蓋一次

set +C

合並正確和錯誤輸出流

&>

&>>

COMMAND > /path/to/somefile 2>&1 合並為正確的,覆蓋

COMMAND >> /path/to/somefile 2>>&1 合並為正確的,追加

tr [a-z] [A-Z] < /etc/issue

cat > /tmp/a.out << END //輸入重定向,創建文件

cat /etc/issue | tee a.tee | tr ‘a-z‘ ‘A-Z‘

tee 將數據流,

一份:保存到a.tee中

一份:送給tr

重點:

1.合並輸出重定向

2>&1 和&>是一樣的,2>>&1,&>>

2.cat和set

cat << /etc/fstab

cat > /tmp/a.out << END //輸入重定向,創建文件

3.stat 展示文件或者文件系統的狀態


bash globbing,IO重定向及管道

glob:*,?,[],[^]

IO重定向:

>,>> 正確的輸出

2>,2>> 錯誤輸出

&>,&>> 混合重定向

> /PATH/to/somefile 2>&1

< <<(here Document)

命令:tr ,tee

tee:讀取標準輸入的數據,並將其內容輸出成文件。
    -a或--append  附加到既有文件的後面,而非覆蓋它.
    -i或--ignore-interrupts 忽略中斷信號
    who | tee who.out
tr:它可以用一個字符來替換另一個字符
    帶有最常用選項的tr命令格式為:
    tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
    -c 用字符串1中字符集的補集替換此字符集,要求字符集為ASCII。
    -d 刪除字符串1中所有輸入字符。
    -s 刪除所有重復出現字符序列,只保留第一個;即將重復出現字符串壓縮為一個字符串。
    input-file是轉換文件名。雖然可以使用其他格式輸入,但這種格式最常用。
2、字符範圍
    指定字符串1或字符串2的內容時,只能使用單字符或字符串範圍或列表。
    [a-z] a-z內的字符組成的字符串。
    [A-Z] A-Z內的字符組成的字符串。
    [0-9] 數字串。
    \octal 一個三位的八進制數,對應有效的ASCII字符。
    [O*n] 表示字符O重復出現指定次數n。因此[O*2]匹配OO的字符串。
tr中特定控制字符的不同表達方式
    速記符含義八進制方式
    \a Ctrl-G  鈴聲\007
    \b Ctrl-H  退格符\010
    \f Ctrl-L  走行換頁\014
    \n Ctrl-J  新行\012
    \r Ctrl-M  回車\015
    \t Ctrl-I  tab鍵\011
    \v Ctrl-X  \030
實例:
1、將文件file中出現的"abc"替換為"xyz"
    # cat file | tr "abc" "xyz" > new_file
 
【註意】這裏,凡是在file中出現的"a"字母,都替換成"x"字母,"b"字母替換為"y"字母,"c"字母替換為"z"字母。而不是將字符串"abc"替換為字符串"xyz"。
 
2、使用tr命令“統一”字母大小寫
    (小寫 --> 大寫)
    # cat file | tr [a-z] [A-Z] > new_file
    (大寫 --> 小寫)
    # cat file | tr [A-Z] [a-z] > new_file
 
3、把文件中的數字0-9替換為a-j
    # cat file | tr [0-9] [a-j] > new_file

4、刪除文件file中出現的"Snail"字符
    # cat file | tr -d "Snail" > new_file
    【註意】這裏,凡是在file文件中出現的‘S‘,‘n‘,‘a‘,‘i‘,‘l‘字符都會被刪除!而不是緊緊刪除出現的"Snail”字符串。
 
5、刪除文件file中出現的換行‘\n‘、制表‘\t‘字符
    # cat file | tr -d "\n\t" > new_file
    不可見字符都得用轉義字符來表示的,這個都是統一的。
 
6、刪除“連續著的”重復字母,只保留第一個    
    # cat file | tr -s [a-zA-Z] > new_file
 
7、刪除空行
    # cat file | tr -s "\n" > new_file

8、刪除Windows文件“造成”的‘^M‘字符
    # cat file | tr -d "\r" > new_file
    或者# cat file | tr -s "\r" "\n" > new_file
   【註意】這裏-s後面是兩個參數"\r"和"\n",用後者替換前者
 
9、用空格符\040替換制表符\011
    # cat file | tr -s "\011" "\040" > new_file
 
10、把路徑變量中的冒號":",替換成換行符"\n"
    # echo $PATH | tr -s ":" "\n"


IO重定向&管道&元字符