LinuxShell——管道命令 摘要:本文主要學習了Shell中的管道命令。 grep命令 grep命令的作用是在文件中提取和匹配符合條件的字元串列,全稱是Global Regular Expressions Print。 基本語法 選項說明 使用舉例 sed命令 sed命令是用來處理流的編輯命令 ...
LinuxShell——管道命令
摘要:本文主要學習了Shell中的管道命令。
grep命令
grep命令的作用是在文件中提取和匹配符合條件的字元串列,全稱是Global Regular Expressions Print。
基本語法
1 [root@localhost ~]# grep [選項] 搜索內容 文件名
選項說明
1 -A n:n為數字,列出符合條件的行,併列出後續的n行。 2 -B n:n為數字,列出符合條件的行,併列出前面的n行。 3 -c:統計找到的符合條件的字元串的次數。 4 -i:忽略大小寫。 5 -n:輸出行號。 6 -v:反向査找,也就是查詢沒有關鍵字的一行。 7 --color=auto:搜索出的關鍵字用顏色顯示。
使用舉例
1 [root@localhost ~]# cat -n file | grep "hello" 2 4 hello 3 6 helloword 4 [root@localhost ~]# cat -n file | grep -c "hello" 5 2 6 [root@localhost ~]# cat -n file | grep -n "hello" 7 4: 4 hello 8 6: 6 helloword 9 [root@localhost ~]# cat -n file | grep -n -A 3 "hello" 10 4: 4 hello 11 5- 5 ss 12 6: 6 helloword 13 7- 7 test123hhhhhhhhh 14 8- 8 ddsdfas 15 [root@localhost ~]#
sed命令
sed命令是用來處理流的編輯命令,全稱是Stream Editor,用程式的方式來編輯文本,它使用預先設定好的編輯指令對輸入的文本進行編輯,完成之後再輸出編輯結構。
sed會一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱為“模式空間”,接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接著處理下一行,這樣不斷重覆,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。
基本語法
1 [root@localhost ~]# sed [選項] [範圍][腳本] 文件名
選項說明
1 -n:使用安靜模式。預設會將文件的所有內容都輸出到屏幕上,使用-n以後只會顯示經過處理的內容。 2 -e 腳本命令:將其後跟的腳本命令添加到已有的命令中。 3 -f 腳本文件:將其後文件中的腳本命令添加到已有的命令中。 4 -r:使命令支持擴展元字元的正則表達式,預設支持基礎元字元的正則表達式。 5 -i:直接修改文件內容。
範圍說明
範圍指的就是sed腳本命令的作用範圍,用來表明該腳本命令作用到文本中的具體行。
預設情況下,sed命令會作用於文本數據的所有行。如果只想將命令作用於特定行或某些行,則必須指明範圍,表示的方法有以下兩種種:
1)以數字形式指定行區間。
當使用數字方式的行定址時,可以用行在文本流中的行位置來引用。sed會將文本流中的第一行編號為1,然後繼續按順序為接下來的行分配行號。
1 n:單個數字表示指定第n行作為sed命令的作用範圍。 2 n1,n2:兩個數字用“,”分隔表示指定包含第n1行到第n2行的內容作為sed命令的作用範圍。 3 n,$:表示指定範圍包含n開始到結束所有內容作為sed命令的作用範圍。
2)用文本模式指定具體行區間。
sed允許指定文本模式來過濾出命令要作用的行,必須用“/”將要指定的文本封起來,sed會將該命令作用到包含指定文本模式的行上,多個內容需要被“/”封起來並且使用“,”分隔。
腳本說明
腳本命令a用來在指定行的下一行添加新增的內容:
1 [範圍]a\新內容
腳本命令i用來在指定行的上一行插入新增的內容:
1 [範圍]i\新內容
腳本命令c用來將指定範圍的內容替換為新內容:
1 [範圍]c\新內容
腳本命令s用來將指定範圍內的指定內容替換成新內容,可以搭配正則表達式使用,也被常用來刪除指定的內容:
1 [範圍]s/查詢內容/新內容/flags
其中,常用的flags標記:
1 g:對數據中所有匹配到的內容進行替換,如果沒有g,則只會在第一次匹配成功時做替換操作。2 p:會列印與替換命令中指定的模式匹配的行。此標記通常與-n選項一起使用。
腳本命令d用來刪除指定範圍的內容:
1 [範圍]d
腳本命令p用來將選取出來的內容顯示在命令行上,通常配合-n使用:
1 [範圍]p
腳本命令w用來將文本中指定範圍的內容寫入新文件中:
1 [範圍]w 新文件
腳本命令r用來將新文件的數據插入到當前文件的指定範圍:
1 [範圍]r 新文件
使用舉例
腳本命令a:
1 [root@localhost ~]# cat -n file | sed '3a\test' 2 1 ccccc 3 2 bbbbb 4 3 dd 5 test 6 4 hello 7 [root@localhost ~]#
腳本命令i:
1 [root@localhost ~]# cat -n file | sed '3i\test' 2 1 ccccc 3 2 bbbbb 4 test 5 3 dd 6 4 hello 7 [root@localhost ~]#
腳本命令c:
1 [root@localhost ~]# cat -n file | sed '3c\test' 2 1 ccccc 3 2 bbbbb 4 test 5 4 hello 6 [root@localhost ~]#
腳本命令s:
1 [root@localhost ~]# cat -n file | sed '2s/bb/aa/' 2 1 ccccc 3 2 aabbb 4 3 dd 5 4 hello 6 [root@localhost ~]# cat -n file | sed '2s/bb/aa/g' 7 1 ccccc 8 2 aaaab 9 3 dd 10 4 hello 11 [root@localhost ~]#
腳本命令d:
1 [root@localhost ~]# cat -n file | sed '2d' 2 1 ccccc 3 3 dd 4 4 hello 5 [root@localhost ~]#
腳本命令p:
1 [root@localhost ~]# cat -n file | sed -n '2p' 2 2 bbbbb 3 [root@localhost ~]#
腳本命令w:
1 [root@localhost ~]# cat -n file | sed -n '1,3w test' 2 [root@localhost ~]# cat test 3 1 ccccc 4 2 bbbbb 5 3 dd 6 [root@localhost ~]#
腳本命令r:
1 [root@localhost ~]# cat -n file | sed '1,2r test' 2 1 ccccc 3 ccccc 4 bbbbb 5 dd 6 2 bbbbb 7 ccccc 8 bbbbb 9 dd 10 3 dd 11 4 hello 12 [root@localhost ~]#
awk命令
awk命令也是逐行掃描文件,尋找含有目標文本的行,如果匹配成功,則會在該行上執行用戶想要的操作,反之則不對行做任何處理。
awk命令的名字來源於此命令的設計者,他們的姓分別是Aho、Weingberger和Kernighan,awk就取自這三位大師姓的首字母。
基本語法
1 [root@localhost ~]# awk [選項] [腳本] 文件名
預設情況下,awk會將如下變數分配給它在文本行中發現的數據欄位:
1 $0:代表整個文本行。 2 $1:代表文本行中的第1個數據欄位。 3 $2:代表文本行中的第2個數據欄位。 4 $n:代表文本行中的第n個數據欄位。
前面說過,在awk中,預設的欄位分隔符是任意的空白字元(例如空格或製表符)。在文本行中,每個數據欄位都是通過欄位分隔符劃分的。awk在讀取一行文本時,會用預定義的欄位分隔符劃分每個數據欄位。
選項說明
1 -F 分隔符:指定輸入行的分隔符,預設分隔符為空格或製表符。 2 -f 腳本文件:從腳本文件中讀取命令,取代在命令行中輸入的命令。 3 -v 變數名=變數值:在執行處理過程之前,設置變數名和變數值。
腳本說明
awk的強大之處在於腳本命令,它由規則和命令兩部分組成:
1 '匹配規則 {執行命令}'
匹配規則用來指定腳本命令可以作用到文本內容中的範圍,可以使用字元串或者正則表達式指定。
整個腳本命令是用“''”括起來,而其中的執行命令部分需要用大括弧“{}”括起來。
如果沒有指定執行命令,則預設會把匹配的行輸出。如果沒有指定匹配規則,則預設匹配文本中所有的行。
使用舉例
使用數據欄位變數,輸出內容之間使用“,”分隔:
1 [root@localhost ~]# echo 'Hello Word' | awk '{print $0}' 2 Hello Word 3 [root@localhost ~]# echo 'Hello Word' | awk '{print $1, $1$2}' 4 Hello HelloWord 5 [root@localhost ~]#
執行多條命令,只要在命令之間使用“;”分隔或者使用回車鍵分隔即可:
1 [root@localhost ~]# echo 'Hello Word' | awk '{$2="Hello"; print $0}' 2 Hello Hello 3 [root@localhost ~]# echo 'Hello Word' | awk '{$2="Hello" 4 > print $0}' 5 Hello Hello 6 [root@localhost ~]#
使用匹配規則指定範圍,“/字元串/”表示匹配含有指定字元串或者正則表達式的行,“$0~/字元串/”用來限制符合匹配規則的數據欄位:
1 [root@localhost ~]# awk '$0~/^T.*o/' file 2 Two lines of test text. 3 Three lines of test text. 4 [root@localhost ~]# awk '$1~/Two/' file 5 Two lines of test text. 6 [root@localhost ~]#
使用邏輯運算符,匹配規則允許使用邏輯運算符(>、<、>=、<=、==、!=)進行匹配:
1 [root@localhost ~]# awk '$1=="Two" {print $0}' file 2 Two lines of test text. 3 [root@localhost ~]#
BEGIN會強制在命令執行前執行BEGIN後面指定的腳本命令:
1 [root@localhost ~]# awk 'BEGIN {print "Begin Read File ..."} {print $0}' file 2 Begin Read File ... 3 One line of test text. 4 Two lines of test text. 5 Three lines of test text. 6 [root@localhost ~]#
END會強制在命令執行前執行END後面指定的腳本命令:
1 [root@localhost ~]# awk 'END {print "End Read File ..."} {print $0}' file 2 One line of test text. 3 Two lines of test text. 4 Three lines of test text. 5 End Read File ... 6 [root@localhost ~]#
從文件中讀取命令,指定分隔符,設定變數:
1 [root@localhost ~]# cat script 2 BEGIN {FS=":"} {print $1 " -> " v} 3 [root@localhost ~]# awk -v v=var -f script file 4 One -> var 5 Two -> var 6 Three -> var 7 [root@localhost ~]#