Linux三劍客之grep,awk,sed命令必知必會
Linux中的Grep,Awk和Sed命令之間有什麼區別?
Grep命令用於查詢檔案中的特定模式,並輸出包含搜尋模式的所有結果。
另一方面,Awk也用於在檔案中搜索某些模式,但會繼續在模式匹配上執行某些任務。
可以同時使用Grep和awk來縮小搜尋增強結果的範圍。
Grep是用於快速搜尋匹配模式的簡單工具,但是awk更像是一種程式語言,用於處理檔案並根據輸入值生成輸出。
sed命令對修改檔案最有用,它搜尋匹配的模式並替換它們並輸出結果。
在Linux中使用Grep命令
Grep命令用於查詢檔案中的特定模式並顯示與該模式匹配的所有欄位。搜尋的模式通常是正則表示式。
在我的示例中,我有一個名為linuxmi的檔案,如下所示:
linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.txt
要在檔案中輸出每個包含“linuxmi”一詞的欄位:
linuxmi@linuxmi:~/www.linuxmi.com$ grep -i "linuxmi" linuxmi.txt
上面命令中的“ -i”告訴grep命令忽略任何區分大小寫的命令。
“ -c”輸出檔案中匹配模式出現次數的計數。
linuxmi@linuxmi:~/www.linuxmi.com$grep -c "linuxmi" linuxmi.txt
要從包含特定模式的目錄中的所有檔案中搜索,我們使用'*'
它顯示了特定的檔案和匹配結果
linuxmi@linuxmi:~/www.linuxmi.com$grep "linuxmi" *
要僅輸出包含匹配模式的檔案,我們使用“ -l”
如果您知道檔名可以輸出所有匹配項,則還可以指定檔名。
grep "linuxmi" test test1 test2
匹配檔案中的整個單詞。
預設情況下,即使在子字串中找到了Grep,也會輸出所有出現的某種特定模式。
為了僅匹配整個單詞,我們使用“ -w”標誌
linuxmi@linuxmi:~/www.linuxmi.com$grep -w "linuxmi" linuxmi.txt
要在搜尋中包含子目錄,請使用“ -r”
linuxmi@linuxmi:~/www.linuxmi.com$grep -r "linuxmi" *
僅輸出匹配的模式。Grep顯示包含匹配模式的整個句子。我們只能使用'-o'字串來顯示搜尋模式。
linuxmi@linuxmi:~/www.linuxmi.com$grep -o "linuxmi" linuxmi.txt
帶數字的輸出是使用'-n'的匹配模式。這將顯示檔案中匹配模式所在的特定數字計數。
linuxmi@linuxmi:~/www.linuxmi.com$grep -n "linuxmi" linuxmi.txt
反轉匹配以使用'-v'顯示不匹配輸入模式的輸出。在這種情況下,我們將輸出不包含單詞“linuxmi”的其他任何內容。
linuxmi@linuxmi:~/www.linuxmi.com$grep -v "linuxmi" linuxmi.txt
匹配以某個字串開頭的所有欄位,例如,輸出所有以單詞“sat”開頭的欄位
匹配以給定字串結尾的行。“ $”正則表示式表示行的結尾,可用於匹配以特定字串結尾的行。在本例中,我們注意匹配以“ 0”結尾的行。
linuxmi@linuxmi:~/www.linuxmi.com$grep "0$" linuxmi.txt
顯示匹配前後的行數
- -A -指定匹配後要顯示的行數
- -B -指定要顯示的行數
- -C -指定匹配之前和之後要顯示的行數
使用“ -e”在同一行中指定多個匹配模式
linuxmi@linuxmi:~/www.linuxmi.com$grep -e "linuxmi" -e "ubuntu" -e "fedora" linuxmi.txt
為了將grep輸出限制在行數以內,我們使用' -m '
linuxmi@linuxmi:~/www.linuxmi.com$grep -m1 "linuxmi" linuxmi.txt
Manny linuxmi account 49000
linuxmi@linuxmi:~/www.linuxmi.com$grep -m2 "linuxmi" linuxmi.txt
Manny linuxmi account 49000
tarun linuxmi sales 15000
在Linux中使用AWK命令
Awk命令更多是用於處理資料和生成報告的指令碼語言。它不需要任何編譯,並且使用者可以使用數字函式,變數,字串函式和邏輯運算子。
它使您能夠以語句形式編寫簡單有效的程式,以在檔案中搜索特定模式,並在找到匹配項時執行操作。
當使用'awk'時,我們將花括號括起來。
模式和動作都形成規則,整個awk程式都用單引號引起來。
如何在Linux中使用AWK命令
預設情況下,Awk命令用於列印檔案的內容。在本例中,沒有指定模式,因此操作應用於檔案的每一行。
linuxmi@linuxmi:~/www.linuxmi.com$awk '{print}' linuxmi.txt
例如,要列印與給定模式匹配的行,讓我們列印其中包含單詞“linuxmi”的所有行。
linuxmi@linuxmi:~/www.linuxmi.com$awk '/linuxmi/'{print}' linuxmi.txt
Awk用於將一行分割成多個欄位並打印出內容。讓我們列印linuxmi.txt檔案中行的第一部分和第二部分。
linuxmi@linuxmi:~/www.linuxmi.com$awk '{print $1,$2}' linuxmi.txt
注意$0輸出整行。
NR -列印行以及行號。
linuxmi@linuxmi:~/www.linuxmi.com$awk '{print NR,$0}' linuxmi.txt
也可以用於指定從某個數字列印到另一個數字。讓我們顯示從第3行到第6行。
NF -輸出每個記錄(行)中包含的欄位數
linuxmi@linuxmi:~/www.linuxmi.com$awk 'NR==3, NR==6 {print NR,$0}' linuxmi.txt
$ NF -列印最後一列
linuxmi@linuxmi:~/www.linuxmi.com$awk '{print NF}' linuxmi.txt
OFS -輸出欄位分隔符–用於指定輸出值的分隔符。
linuxmi@linuxmi:~/www.linuxmi.com$awk 'OFS="/" {print $1,$4}' linuxmi.txt
Awk BEGIN和END規則
BEGIN規則應該在任何文字處理之前執行一次,並且在執行其他任何操作之前先執行。
新增模式
大於的值的輸出。例如,在我們的檔案中,最後一個欄位表示薪水數字,我們只需要在值大於35000時輸出
linuxmi@linuxmi:~/www.linuxmi.com$awk '$NF>=35000 {print $1,$4}' linuxmi.txt
內建函式
awk帶有內建函式,例如數值,如下所示
linuxmi@linuxmi:~/www.linuxmi.com$awk 'BEGIN{print sqrt(400)}'
20
Awk指令碼
如果發現自己編寫了複雜的awk命令,則可以選擇將它們放在指令碼檔案(.awk)中並從那裡執行它們。
在Linux中使用SED命令
SED是流編輯器(stream editor)的縮寫。
它可以用於執行不同的功能,例如搜尋,查詢和替換,插入和刪除。
但是,查詢和替換很常見,您無需開啟檔案即可替換單詞。
將測試檔案中的“linuxmi”一詞替換為“xxvi”並輸出結果:
linuxmi@linuxmi:~/www.linuxmi.com$sed 's/linuxmi/xxvi/' linuxmi.txt
為了替換每次出現,我們在表示式的末尾新增“ g”,如下所示
linuxmi@linuxmi:~/www.linuxmi.com$sed 's/linuxmi/xxvi/g' linuxmi.txt
要僅替換特定數量的出現次數,請在'g'處指定數字。例如,最多替換第四行:
linuxmi@linuxmi:~/www.linuxmi.com$sed 's/linuxmi/xxvi/4' linuxmi.txt
要從某個特定位置替換為檔案的其餘部分,請指定以數字開頭的數字和'g'來表示檔案的全部或其餘部分。
linuxmi@linuxmi:~/www.linuxmi.com$sed 's/linuxmi/xxvi/4g' linuxmi.txt
要僅替換特定行,請在下面的第三行中指定要替換的檔案行。
linuxmi@linuxmi:~/www.linuxmi.com$sed '3 s/linuxmi/xxvi/' linuxmi.txt
要僅列印替換的行而不是列印所有檔案內容:
linuxmi@linuxmi:~/www.linuxmi.com$sed -n 's/linuxmi/xxvi/p' linuxmi.txt
從某一行開始更換,例如,從第3行到最後
linuxmi@linuxmi:~/www.linuxmi.com$sed '3,g s/linuxmi/xxvi/' linuxmi.txt
使用SED刪除檔案的行。例如,要刪除檔案的第5行:
linuxmi@linuxmi:~/www.linuxmi.com$sed '5d' linuxmi.txt
要刪除最後一行:
linuxmi@linuxmi:~/www.linuxmi.com$sed '$d' linuxmi.txt
從第n行開始刪除到最後,例如,從第3行到最後:
linuxmi@linuxmi:~/www.linuxmi.com$sed '3,$d' linuxmi.txt
要刪除模式匹配檔案:
linuxmi@linuxmi:~/www.linuxmi.com$sed '/pattern/d' linuxmi.txt
這就是我們有關如何在Linux中使用Grep,Awk和Sed命令的指南。
參考:https://www.linuxmi.com/linux-grep-awk-sed.html