1. 程式人生 > >【shell指令碼】常用工具的學習grep、sed、awk、cut

【shell指令碼】常用工具的學習grep、sed、awk、cut

grep

功能:
查詢過濾工具,查詢或者過濾出符合某個模式的字串,可以和正則表示式搭配使用。
所以本篇部落格適合有正則表示式基礎的讀者閱讀哦~。
用法:

grep '正則表示式' 操作的檔名
egrep '正則表示式' 操作的檔名
grep -E '正則表示式' 操作的檔名
grep -F '匹配的字串' 操作的檔名
fgrep  '匹配的字串' 操作的檔名

其中,egrep相當於grep -E,表示採用擴充套件(Extend)的正則表示式語法。即對於? + {} () | 這些字元取其特殊含義。直接使用grep表示採用正則表示式基準的(Basic)正則表示式語法。
fgrep相當於grep -F,表示不搜尋正則表示式模式,匹配固定字串,匹配到了會輸出整行。
eg:從file檔案中找出合法的手機號碼:
這裡寫圖片描述

這裡寫圖片描述


sed

簡介:
sed是一款流式文字編輯器,它會將文字中的內容一行一行讀出來,看是否與正則表示式匹配,如果匹配則執行對應的操作,否則丟棄或輸出然後讀取下一行。可以一次處理多個檔案,預設按照基準模式(Basic)匹配

用法:

sed '/pattern/action'

其中,pattern 表示對要匹配的行的描述,即正則表示式,action表示匹配到了之後對應的操作。
1、將匹配到的內容打印出來,對應的action:p
這裡寫圖片描述
可以看到,sed將檔案所有內容都列印了出來,只不過匹配到了的列印了兩次。想只打印匹配到的行加上‘-n’引數即可:
這裡寫圖片描述

2、將匹配到的內容刪除,對應的action:d
這裡寫圖片描述


說明,sed並不會修改原檔案。如果想直接修改原檔案,需要加上‘-i’引數即可:
這裡寫圖片描述

3、將匹配到的行內的某一模式的字串替換,對應的action:s
用法與之前有一點小差異:

sed '/pattern/s/pattern1/pattern2/'
sed '/pattern/s/pattern1/pattern2/g' 

表示,匹配符合pattern的行,將該行第一個匹配pattern1的字串替換為pattern2。最後加g表示全域性替換。
eg:
這裡寫圖片描述


awk

簡介:
awk是比sed更加強大的文字編輯器,不僅可以按行處理文字,也可以按列處理文字。同時還是一門指令碼語言,有像C語言一樣的迴圈和分支,有些部分和C語言十分相似。

用法:

awk '/pattern/{actions}'

pattern是正則表示式,actions是⼀系列操作。 awk程式⼀⾏⼀⾏讀出待處理⽂件,如果某⼀⾏與pattern匹配,或者滿⾜condition條件,則執⾏相應的actions,如果⼀條awk命令只 有actions部分,則actions作⽤於待處理⽂件的每⼀⾏。
1、awk按列列印。action:print/printf
這裡寫圖片描述
除了print,還可以用printf,用法和C語言一模一樣。print後所跟的$2表示列印第二列,$1表示第一列,$0表示所有的列。awk預設的列分隔符是連續的空格或者Tab,也可以自己制定列分隔符, 引數:-F後跟制定的符號:
這裡寫圖片描述

2、awk指令碼
這裡寫圖片描述
指令碼第一行:#!/usr/bin/awk -f 指定awk直譯器。
awk會先執行BEGIN標籤內的語句,然後讀取指定檔案內容,執行花括號內的語句,讀取完畢執行END標籤內的語句。


cut

簡介:
cut以行為處理物件,負責資料的剪下。

用法:

cut -b   //按位元組切割 
cut -c    //按字元切割

eg:
這裡寫圖片描述
可以看到,按字元切割時,一個字母和一個漢字都算是一個字元。除此之外,cut可以指定域分隔符,切割指定的域:
這裡寫圖片描述
-d 選項指定域分隔符,-f選項指定切割第幾個域。