sed 和 awk命令及語法詳解

sed命令正則表達式

list文件內容以下shell

John Daggett,341 King Road,Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas ,402 Lans Road, Beaver Falls PA
Eric Adams,20 Post Road,Sudbury MA
Hubert Sims,  328A Brook Road,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter, 73 6th Street,Boston MAbash


一、替換ide

 1.1sed 's/MA/Masschusetts/' list.txt
John Daggett,341 King Road,Plymouth Masschusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas ,402 Lans Road, Beaver Falls PA
Eric Adams,20 Post Road,Sudbury Masschusetts
Hubert Sims,  328A Brook Road,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter, 73 6th Street,Boston Masschusetts
測試

注意:並非在任何狀況下都要講指令包圍起來,可是應該養成習慣,使用單引號能夠阻止shell解釋編輯指令中的特殊字符或空格。
spa

1.2 sed 's/ MA/, Masseets/' list.txt
John Daggett,341 King Road,Plymouth, Masseets
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas ,402 Lans Road, Beaver Falls PA
Eric Adams,20 Post Road,Sudbury, Masseets
Hubert Sims,  328A Brook Road,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter, 73 6th Street,Boston, Masseets
命令行

注意:此類句子就須要使用單引號,由於替換命令中包含空格。爲了在,Boston  和MA之間放置逗號,指令用一個逗號和一個空格取代兩字母縮寫詞前面的空格。排序

二、有三種方式能夠指定命令行上的多重指令。ip

2.1.用分號分隔指令。get

sed 's/ MA/, Massettd/ ; s/ PA/, Pens/' list.txt
John Daggett,341 King Road,Plymouth, Massettd
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas ,402 Lans Road, Beaver Falls, Pens
Eric Adams,20 Post Road,Sudbury, Massettd
Hubert Sims,  328A Brook Road,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter, 73 6th Street,Boston, Massettd

2.2.在每一個指令前放置-e.

sed -e 's/ MA/, Massetts/' -e 's/ PA/, Pens/' list.txt
John Daggett,341 King Road,Plymouth, Massetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas ,402 Lans Road, Beaver Falls, Pens
Eric Adams,20 Post Road,Sudbury, Massetts
Hubert Sims,  328A Brook Road,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter, 73 6th Street,Boston, Massetts

2.3.使用Bourne shell 的分行指令功能。在輸入單引號後按return鍵,就會出現多行輸入的提示符(>)

sed '
> s/ MA/, Massetts/
> s/PA/, pENS/
> s/CA/, California/' list.txt
John Daggett,341 King Road,Plymouth, Massetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas ,402 Lans Road, Beaver Falls , pENS
Eric Adams,20 Post Road,Sudbury, Massetts
Hubert Sims,  328A Brook Road,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View , California
Sal Carpenter, 73 6th Street,Boston, Massetts

注意:在shell中採用的方法是,在每一個指令的結尾使用分號,而且經過用反斜槓做爲每一行的結尾,從而能夠輸入跨越多行的命令。

3.腳本文件。

sed -f scriptfile file

 sed -f test.sh list.txt
John Daggett,341 King, hello,Plymouth, Massetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge, hello, Tulsa OK
Terry Kalkas ,402 Lans, hello, Beaver Falls, Pens
Eric Adams,20 Post, hello,Sudbury, Massetts
Hubert Sims,  328A Brook, hello,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter, 73 6th Street,Boston, Massetts

####################

cat test.sh
#!/bin/sh
s/ MA/, Massetts/
s/ PA/, Pens/
s/ Road/, hello/

4.保存輸出

只有將sed的輸出重定向到另外一個程序中,纔可以捕獲文件中的輸出。

語法:sed  -f scriptfile file > newfile

sed -f test.sh list.txt  > test
cat test
John Daggett,341 King, hello,Plymouth, Massetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge, hello, Tulsa OK
Terry Kalkas ,402 Lans, hello, Beaver Falls, Pens
Eric Adams,20 Post, hello,Sudbury, Massetts
Hubert Sims,  328A Brook, hello,Roanoke VA
Amy Wilde, 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter, 73 6th Street,Boston, Massetts

注意:不要將輸出重定向到正在編輯的文件中,不然就會使他變成亂碼。

5.阻止輸入行的自動顯示。

sed默認操做是輸出每一個輸入行,-n選項能夠阻止自動輸出,當指定該選型時,每一個要生成輸出的指令都必須包含打印命令p。

sed -n  's/ MA/,Massets/p' list.txt
John Daggett,341 King Road,Plymouth,Massets
Eric Adams,20 Post Road,Sudbury,Massets
Sal Carpenter, 73 6th Street,Boston,Massets

6.混合選項

經過合併命令行上-e和-f選項能夠構建一個腳本,該腳本是全部命令按命令的給出順序結合起來的。

選項總結

-e 編輯隨後的指令

-f 跟隨腳本中的文件名

-n 阻止輸入行的自動輸出


awk命令

與sed類似,awk爲每一個輸入行執行一套指令,能夠在命令行上指定指令或者建立腳本文件。

每次從一個或者多個文件中讀入一行,或者從標準輸入中讀入一行。指令必須包含在單引號中,從而與shell區別開。能夠用與sed相同的方式輸入多重命令行,用分號分隔命令或使用Borune shell的多行輸入功能。

awk程序一般被放置在能夠對他們進行測試和修改的文件中,用腳本文件調用。

語法:awk -f scriptfile file

1.單個指令,用於打印輸入文件中每行的第一個字段  。$1表示每一個輸入行上第一個字段的值

awk '{print $1}' list.txt
John
Alice
Orville
Terry
Eric
Hubert
Amy
2.打印匹配"/MA/"模式的每一行。

awk '/MA/' list.txt
John Daggett,341 King Road,Plymouth MA
Eric Adams,20 Post Road,Sudbury MA
Sal Carpenter, 73 6th Street,Boston MA

3.在"/MA/"模式中使用一條print語句限制只輸出每條記錄的第一個字段。

awk '/MA/ {print $1}' list.txt
John
Eric
Sal

4.使用-F選項將字段分隔符改變爲逗號。

awk -F, '/MA/ {print $1}' list.txt
John Daggett
Eric Adams
Sal Carpenter

注意:改變字段分隔符的-F選項與指定腳本文件名的-f選項是不一樣的。

5.將「MA」模式中每一個字段單獨打印在這一行上,多重命令由分號隔開。

awk -F, ' /MA/ {print $1 ; print $2;print $3}' list.txt
John Daggett
341 King Road
Plymouth MA
Eric Adams
20 Post Road
Sudbury MA
Sal Carpenter
 73 6th Street
Boston MA

6.出錯信息

. 沒有使用大括號( {} )將過程括起來

. 沒有使用單引號(' ')將指令括起來

. 沒有使用斜槓(//)將正則表達式括起來

7.選項總結

-f  跟隨腳本的文件名

-F 改變字段分隔符

-v 跟隨var = value


同時使用sed 和 awk

1.sed產生的輸出被輸送到awk的程序中,awk將從每條記錄中提取中每行的第三個字段。

sed -f test.sh list.txt | awk -F, ' {print $3}'
 hello
 Richmond VA
 hello
 hello
 hello
 hello
 Mountain View CA
Boston

2.能夠將上訴的輸入傳遞給sort|uniq -c ,他會將輸出按字母順序表排序,以及輸出的內容。

sed -f test.sh list.txt | awk -F, ' {print $3}' |sort |uniq -c
      1
      1 Boston
      5  hello
      1  Mountain View CA
      1  Richmond VA

課後題:

按州的名字排序並列出州的名字,以及住在那個州的人的名字

[root@localhost opt]# cat test
Alice Ford, 22 East Broadway, Richmond, Virginia
Hubert Sims,  328A Brook Road,Roanoke, Virginia
John Daggett,341 King Road,Plymouth, Massachusetts
Eric Adams,20 Post Road,Sudbury, Massachusetts
Sal Carpenter, 73 6th Street,Boston, Massachusetts
Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
Terry Kalkas ,402 Lans Road, Beaver Falls, Pennsylvania


腳本:

[root@localhost opt]# cat test1.sh
#!/bin/bash
awk -F, '{print $4 "," $0}'  $* |sort |
awk -F, '
$1 == LastState {
print "\t" $2
}
$1 != LastState {
LastState = $1
print $1
print "\t" $2
}'

輸出結果:

[root@localhost opt]# sh test1.sh test Massachusetts    Eric Adams    John Daggett    Sal Carpenter Oklahoma    Orville Thomas Pennsylvania    Terry Kalkas  Virginia    Alice Ford    Hubert Sims

相關文章
相關標籤/搜索