IO重定向&管道&元字符
一、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重定向&管道&元字符