歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Awk和Sed的基本使用

Awk和Sed的基本使用

日期:2017/3/1 17:22:42   编辑:關於Linux
Awk和Sed的基本使用

可以用大至相同的方式調用sed 和awk 。命令行講法是:
command [options] script filename
幾乎和所有的unlx程序一樣,sed和awk都可以從標准輸入中取得輸入並將輸出發送到標准輸出。如果指定文件名filename,輸入就取自那個文件。輸出包含處理後的信息。標准輸出是指屏幕,而且一般來自這些程序的輸出都輸出到那裡。輸出也可被送到一個文件。例如she11中的I/O重定向,但是不允許送到向程序提供輸入的同一個文件。每個命令的options是不同的。

scipt指定了要執行的指令。如果在命令行上script,假如它包含有可以由she11解釋的空格或任意字符(例如$和*),那麼它必須用單引號括起。

sed和awk一個共同的選項是-f選項,這個選項允許你指定腳本文件的名字。附著腳本大小的增長,將它放置在文件中比較方便。因此,可以按如下方式調用sed:
sed -f scriptfile inputfile

在sed和awk中,每個指令都包括兩個部分:模式和過程。模式是由斜槓(/)分隔的正則表達式。過程指定一個或多個將被執行的動作。

sed:

只有在命令行上給出多個指令時才需要用-e選項。它告訴sed將一下參數解釋為指令。當只有一個指令時,sed可以自己做決定。
sed [-e] 'instruction' file

並不是在任何情況下都需要將指令用單引號包圍起來,但是你應該養成這個習慣。使用單引號可以阻止she11解釋編輯指令中的特殊字符或空格(she11使用空格決定才是交給程序獨立參數,特殊的she11字符在調用之前被展開)。
[root@ds-education2 ~]# cat test
John Daggett, 341 King Road, Plymouth MA
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MA
[root@ds-education2 ~]# sed 's/MA/MACK/' test //該指令只影響了3 行,但顯示出了所有行。
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#

有3 種方式可以指定命令行上的多重指令:
1、
[root@ds-education2 ~]# sed 's/MA/MACK/; s/VA/VACK/' test //使用;號處理
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VACK
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VACK
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
2、
[root@ds-education2 ~]# sed -e 's/MA/MACK/' -e 's/VA/VACK/' test //使用-e選項來實現
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VACK
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VACK
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
3、
[root@ds-education2 ~]# sed '
> s/MA/MACK/
> s/PA/PACK/
> s/CA/CACK/' test //輸入sed '之後回車即可,這種技術在C she11中不能使用。
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#

顯示在屏幕上的結果是臨時的,輸入文件中沒有發生改變!!!

sed後接腳本文件:
sed -f script file
[root@ds-education2 ~]# cat sed_test
s/MA/MACK/
s/PA/PACK/
s/CA/CACK/
[root@ds-education2 ~]# sed -f sed_test test
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#

保存輸出:
[root@ds-education2 ~]# sed -f sed_test test > sed_write //使用重定向即可
[root@ds-education2 ~]# cat sed_write
John Daggett, 341 King Road, Plymouth MACK MA
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#

阻止輸入行的自動輸出:
sed的默認操作是輸出每個輸入行。-n選項可以阻止自動輸出。當指定該選項時,每個要生成輸出的指令都必須包含打印命令p
[root@ds-education2 ~]# sed -n 's/MA/MACK/' test //接-n就不輸出了
[root@ds-education2 ~]# sed -n 's/MA/MACK/p' test //加上p後,被處理的行都被輸出了
John Daggett, 342 King Road, Plymouth MACK
Eric Adams, 20 Post Road, Sudbury MACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#

sed的命令選項:
選項描述
-e 編輯隨後的指令
-f 跟隨腳本中的文件名
-n 阻止輸入行的自動輸出

Awk
每次從一個或多個文件中讀入一行或從標准輸入中讀入一行。指令必須包含在單引號中,從而與shell區別開(指令幾乎總是包含大括號和/或美元符號,she11將它們解釋為特殊符號)。可以用與sed相同的方式輸入多重命令行:用分號分隔命令或使用Boruneshell的多行輸入功能。
盡管awk指令與sed指令的結構相同,都由模式和過程兩部分組成,但過程本身有很大的不同。awk看上去不像編輯器而更像一種程序設計語言。語句和函數取代了使用一個或兩二個字符組成的命令序列。例如,使用print語句打印表達式的值或打印當前輸入行的內容。
在通常情況下,awk將每個輸入行解釋為一條記錄而將一行上的每個單詞(由空格或制表符分隔)解釋為每一個字段(可以改變這些默認設置)。一個或多個連續的空格或制表符看做一個定界符。awk允許在模式或過程中引用這些字段。$0代表整個記錄。
[root@ds-education2 ~]# cat test
John Daggett, 342 King Road, Plymouth MA
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MA
[root@ds-education2 ~]# awk '{ print $1 }' test //用於打印輸入文件中每行的第一個字段。
John
AI
Orvi
Terry
Eric
Hubert
Amy
Sal
[root@ds-education2 ~]#

"$1" 表示每個輸入行上的第一個字段的值。因為這裡沒有指定模式,所以打印語句應用於所有的行。下一個示例指定了"/MA/"模式,但是其中沒有過程。這個默認操作是打印匹配這種模式的每一行。
[root@ds-education2 ~]# awk '/MA/' test //這個默認操作是打印匹配MA這種模式的每一行
John Daggett, 342 King Road, Plymouth MA
Eric Adams, 20 Post Road, Sudbury MA
Sal Carpenter, 73 6th Street, 8oston MA
[root@ds-education2 ~]#
[root@ds-education2 ~]# awk '/MA/ { print $1 }' test //打印出含有MA的行的第一字段(默認空格或者制表符隔開)
John
Eric
Sal
[root@ds-education2 ~]#

使用-F選項將字段分隔符改變為逗號
[root@ds-education2 ~]# awk -F, '/MA/ { print $1 }' test
John Daggett
Eric Adams
Sal Carpenter
[root@ds-education2 ~]#

[root@ds-education2 ~]# cat test1
taobao,facebook,baidu
google,sina,sohu
wangyi,shengda,51cto
[root@ds-education2 ~]# awk -F, ' { print $1 }; { print $2 }; {print $3} ' test1
taobao
facebook
baidu
google
sina
sohu
wangyi
shengda
51cto
[root@ds-education2 ~]#

awk的命令行選項:
-f 跟隨腳本的文本名
-F 改變字段分隔符
-v 跟隨var=value

Awk和Sed通過管道配合使用:
[root@ds-education2 ~]# cat test1
taobao,facebook,baidu
google,sina,sohu
wangyi,shengda,51cto
[root@ds-education2 ~]# cat sed_test1
s/taobao/TAOBAO/
s/google/GOOGLE/
s/wangyi/WANGYI/
[root@ds-education2 ~]# sed -f sed_test1 test1 | awk -F, '{ print $1 } '
TAOBAO
GOOGLE
WANGYI
[root@ds-education2 ~]#

本文出自 “枯木的Linux博客” 博客
Copyright © Linux教程網 All Rights Reserved