sed命令
list文件内容如下
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 MA
1、替换
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解释编辑指令中的特殊字符或空格。
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之间放置逗号,指令用一个逗号和一个空格取代两字母缩写词前面的空格。
2、有三种方式可以指定命令行上的多重指令。
2.1.用分号分隔指令。
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