1. 程式人生 > 實用技巧 >grep,sed,awk常見應用及總結

grep,sed,awk常見應用及總結

grep(主要用於查詢):

grep root /etc/passwd =cat /etc/passwd |grep root

-n  顯示行數
--color  高亮顯示關鍵字
-v    查詢關鍵字以外的內容
-A3  檢視關鍵字後3行的內容  after
-B2  檢視關鍵字前2行的內容  before

grep是查詢匹配條件的行,find是搜尋匹配條件的檔案。

[root@CentOS8 test]# grep "energywise" * #在當前目錄搜尋帶'energywise'行的檔案。
aa.txt:energywise
[root@CentOS8 test]# grep -r "
energywise" * #在當前目錄及其子目錄下搜尋'energywise'行的檔案。 aa.txt:energywise [root@CentOS8 test]# grep -r -l "energywise" * #在當前目錄及其子目錄下搜尋'energywise'行的檔案,但是不顯示匹配的行,只顯示匹配的檔案。 aa.txt

sed(主要對行的關鍵字進行處理):

  • -n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到終端上。但如果加上 -n 引數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
  • -e :直接在命令列模式上進行 sed 的動作編輯(可以作為測試用,不會修改檔案內容);
  • -f :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的 sed 動作;
  • -r :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法);
  • -i :直接修改讀取的檔案內容,而不是輸出到終端(會修改檔案內容);

動作說明: [n1[,n2]]

function n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』

function:

  • a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
  • c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
  • d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;
  • i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p :列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起執行~
  • s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

只要刪除第 2 行

nl /etc/passwd | sed '2d' 

要刪除第 3 到最後一行

nl /etc/passwd | sed '3,$d' 

在第二行後(亦即是加在第三行)加上123字樣!

nl /etc/passwd | sed '2a 123'

在第二行前面加上123字樣!

nl /etc/passwd | sed '2i 123' 

將第二行到第五行的內容替換為 No 2-5 number

nl /etc/passwd | sed '2,5c No 2-5 number'

輸出第5行和第7行的內容

nl /etc/passwd | sed -n '5,7p'

(刪除指定行)刪除/etc/passwd所有包含root的行,其他行輸出

nl /etc/passwd | sed  '/root/d'

多個命令同時執行:刪除第3行到最後的內容,並把123改為root

sed -e '3,$d' -e 's/123/root/g'  test.txt

修改匹配內容

sed -e "s#匹配內容#修改內容#g"  檔名   測試
sed -i "s#匹配內容#修改內容#g"  檔名    修改

[root@CentOS8 test]# sed -e 's#energywise#boxiaoyuan#g' aa.txt 
boxiaoyuan
[root@CentOS8 test]# sed -i 's#energywise#boxiaoyuan#g' aa.txt  
[root@CentOS8 test]# cat aa.txt 
boxiaoyuan

awk(主要對行的多個欄位進行處理):

格式:awk '{pattern + action}' {filenames}
cat /etc/passwd |awk  -F ':'  '{print $1}' 
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
awk -F: '/root/' /etc/passwd