grep,sed,awk常見應用及總結
阿新 • • 發佈:2020-08-15
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