grep、sed、awk三劍客
grep命令主要用於文本內容的查找。它支持正則表達式查找,命令格式為:
grep [option] pattern filename
例如:在filename文本中查找包含”text”的行:
grep "text" filename
這條命令默認只輸出匹配的文本行
option為-o時,命令行只輸出匹配的文本
option為-v時,命令行只輸出沒有匹配的文本行
option為-R -r時,匹配目錄下的所有文件
二、sed
sed命令主要用於文本內容的編輯。默認只處理模式空間,不處理原數據,而且sed是針對一行行數據來進行處理的。
sed的命令格式為:
sed [option] 'command' filename
option常用選項有以下:
-n:使用安靜(silent)模式。
在一般sed的用法中,所有來自stdin的數據一般都會被列出到終端上。
但如果加上-n參數後,則只有經過sed特殊處理的那一行(或者動作)才會被列出來。
-e:直接在命令列模式上進行sed的動作編輯。
-i:直接修改讀取的文件內容,而不是輸出到終端。
command可以分為以下幾種:
a:追加,a的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
i:插入,i的後面可以接字串,而這些字串會在新的一行出現(目前的上一行)
d:以行為單位的刪除
c:以行為單位的替換,c的後面可以接字串
s:在行中搜尋並替換
p:以行為單位的顯示,通常p會與參數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:正則表達式中\s表示空白字符(包括,空格,制表符等)
三、awk
awk命令主要用於文本內容的分析處理。
如果對處理的數據需要生成報告之類的信息,或者處理的數據是按列進行處理的,最好使用awk。
awk讀入有’\n’換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,$0則表示所有域,$1表示第一個域,$n表示第n個域。
例如:以”:”分隔filename文本的每一行並且打印第一列
awk -F ':' '{print $1}' filename
打印可以采用print函數,如果需要格式化打印,則類似C語言一樣采用printf函數。
練習:sed和awk定制化顯示舉例
1、可以制作一個文本test.txt,內容為:
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
需要顯示的結果為:
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=":"
grep、sed、awk三劍客