摘要:本文主要學習了Shell中的管道命令。正則表達式
grep命令的做用是在文件中提取和匹配符合條件的字符串行,全稱是Global Regular Expressions Print。學習
1 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命令是用來處理流的編輯命令,全稱是Stream Editor,用程序的方式來編輯文本,它使用預先設定好的編輯指令對輸入的文本進行編輯,完成以後再輸出編輯結構。spa
sed會一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」,接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無改變,除非你使用重定向存儲輸出。命令行
1 sed [選項] [範圍][腳本] 文件名
1 -n:使用安靜模式。默認會將文件的全部內容都輸出到屏幕上,使用-n之後只會顯示通過處理的內容。 2 -e 腳本命令:將其後跟的腳本命令添加到已有的命令中。 3 -f 腳本文件:將其後文件中的腳本命令添加到已有的命令中。 4 -r:使命令支持擴展元字符的正則表達式,默認支持基礎元字符的正則表達式。 5 -i:直接修改文件內容。
範圍指的就是sed腳本命令的做用範圍,用來代表該腳本命令做用到文本中的具體行。設計
默認狀況下,sed命令會做用於文本數據的全部行。若是隻想將命令做用於特定行或某些行,則必須指明範圍,表示的方法有如下兩種種:code
1)以數字形式指定行區間。blog
當使用數字方式的行尋址時,能夠用行在文本流中的行位置來引用。sed會將文本流中的第一行編號爲1,而後繼續按順序爲接下來的行分配行號。ip
1 n:單個數字表示指定第n行做爲sed命令的做用範圍。 2 n1,n2:兩個數字用「,」分隔表示指定包含第n1行到第n2行的內容做爲sed命令的做用範圍。 3 n,$:表示指定範圍包含n開始到結束全部內容做爲sed命令的做用範圍。
2)用文本模式指定具體行區間。字符串
sed容許指定文本模式來過濾出命令要做用的行,必須用「/」將要指定的文本封起來,sed會將該命令做用到包含指定文本模式的行上,多個內容須要被「/」封起來而且使用「,」分隔。it
腳本命令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命令的名字來源於此命令的設計者,他們的姓分別是Aho、Weingberger和Kernighan,awk就取自這三位大師姓的首字母。
1 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 ~]#