sed 和 awk命令及语法详解

简介:

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










本文转自 妙曼  51CTO博客,原文链接:http://blog.51cto.com/yanruohan/1900241,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Perl
sed的用法
sed的用法
27 2
|
3月前
|
Unix Perl
sed的具体用法
sed的具体用法
19 2
|
3月前
|
Perl
sed的基本语法
sed的基本语法
17 2
|
3月前
|
Perl
sed的复杂用法
sed的复杂用法
28 2
|
11月前
|
Perl
sed 基本用法
sed 基本用法
65 0
|
11月前
|
Unix Shell Linux
两个实用的shell命令:sed和awk用法
两个实用的shell命令:sed和awk用法
96 0