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

相关文章
相关标签/搜索