Linux命令三劍客:grep、sed、awk
一、grep
grep命令主要用于文本內(nèi)容的查找。它支持正則表達式查找,命令格式為:
- grep [option] pattern filename
例如:在filename文本中查找包含”text”的行:
- grep "text" filename
這條命令默認只輸出匹配的文本行
- option為-o時,命令行只輸出匹配的文本
- option為-v時,命令行只輸出沒有匹配的文本行
- option為-R -r時,匹配目錄下的所有文件
二、sed
sed命令主要用于文本內(nèi)容的編輯。默認只處理模式空間,不處理原數(shù)據(jù),而且sed是針對一行行數(shù)據(jù)來進行處理的。
sed的命令格式為:
- sed [option] 'command' filename
option常用選項有以下:
- -n:使用安靜(silent)模式。
- 在一般sed的用法中,所有來自stdin的數(shù)據(jù)一般都會被列出到終端上。
- 但如果加上-n參數(shù)后,則只有經(jīng)過sed特殊處理的那一行(或者動作)才會被列出來。
- -e:直接在命令列模式上進行sed的動作編輯。
- -i:直接修改讀取的文件內(nèi)容,而不是輸出到終端。
command可以分為以下幾種:
- a:追加,a的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的下一行)
- i:插入,i的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的上一行)
- d:以行為單位的刪除
- c:以行為單位的替換,c的后面可以接字串
- s:在行中搜尋并替換
- p:以行為單位的顯示,通常p會與參數(shù)sed -n一起運行
例如:
1、在filename文本最后一行追加hello world:
- sed '$a hello world' filename
2、在filename文本第一行插入hello world:
- sed '1i hello world' filename
3、既要在最后一行追加hello world,又要在第一行插入hello world:
- sed -e '$a hello world' -e '1i hello world' filename
另外,sed比較常用的就是文本替換,它也支持正則表達式,功能強大。
例如:
1、表示將filename文本的每行中的oldstring替換為newstring:
- sed 's/oldstring/newstring/g' filename
2、刪除空白行:
- sed '/^\s*$/d' filename
PS:正則表達式中\(zhòng)s表示空白字符(包括,空格,制表符等)
三、awk
awk命令主要用于文本內(nèi)容的分析處理。
如果對處理的數(shù)據(jù)需要生成報告之類的信息,或者處理的數(shù)據(jù)是按列進行處理的,使用awk。
awk讀入有’\n’換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,$0則表示所有域,$1表示第一個域,$n表示第n個域。
例如:以”:”分隔filename文本的每一行并且打印第一列
- awk -F ':' '{print $1}' filename
打印可以采用print函數(shù),如果需要格式化打印,則類似C語言一樣采用printf函數(shù)。
練習:sed和awk定制化顯示舉例
1、可以制作一個文本test.txt,內(nèi)容為:
- This is my cat, my cat's name is betty
- This is my dog, my dog's name is frank
- This is my fish, my fish's name is george
- This is my goat, my goat's name is adam
需要顯示的結(jié)果為:
- cat:betty
- dog:frank
- fish:george
- goat:adam
如果采用sed,可以輸入
- sed 's/This is my \(.*\),.*is \(.*\)/\1:\2/g' test.txt
如果采用awk,則有兩種方法
- awk -F '[ ,]' '{print $4,$10}' OFS=":" test.txt
- awk -F '[ ,]' '{printf("%s:%s\n",$4,$10)}' test.txt
- awk -F, '{print $1,$2}' test.txt|awk '{print $4,$9}' OFS=":"