sed和awk的基本使用

    在sed和awk中,每个指令都包括两个部分:模式和过程。模式是由斜杠(/)分割的正则表达式。过程制定一个或多个将被执行的动作。

    执行过程中,读取脚本中的第一个指令并检测当前行的模式,如果没有匹配,这个过程被忽略并读取下一个指令。读取所有的指令,而不是读取与输入行匹配的第一条指令。

    所有指令被解释并应用于单个行后,sed输出该行并循环处理每个输入行。awk不自动输出行,脚本中的指令控制awk最终所做的事情。


使用sed

调用sed有两种方法:在命令行上指定编辑指令,或者将他们放到一个文件中并提供这个文件的名字。

    sed  -e  ' instruction'   file

[root@master sedawk]# cat 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


[root@master sedawk]# sed ' s/MA/, Massachusetts/' list 

为了使Boston 和MA之间放逗号,指令用一个逗号和一个空格取代俩字母缩写词前面的空格。


有3中方式可以指定命令行上的多重指令:

  1. 用分号分隔指令。

    sed ' s/MA/, Massachusetts/; s/ PA/, Pennsylvania/' list 

  2. 在每个指令前放置-e,-e就是能让sed识别脚本命令。

    sed  -e ' s/MA/, Massachusetts/' -e  ' s/ PA/, Pennsylvania/' list

  3. 使用Bourne  shell的分行指令功能。在输入单引号后按return键,就会出现多行输入的提示符(>)。

    sed '

    > s/MA/, Massachusetts/

    >s/ PA/, Pennsylvania/'   list


脚本文件:

在命令行上输入较长的编辑脚本是不实际的。所以需要创建脚本文件来放sed命令。用-f来指定脚本文件的名字。

    sed   -f   scriptfile    file

阻止输入行的自动显示:

sed的默认操作是输出每个输入行,-n可以阻止自动输出。当指定-n时,要输出行,就需要加打印命令p。

    sed -n -e 's/MA/Massachusetts/p'  list 

sed的命令行选项总结:

-e    编辑随后的命令

-f    跟随脚本中的文件名

-n    阻止输入行的自动输出



使用awk:

命令行语法:

awk  'instructions'  files

指令必须包含在单引号中,从而与shell区别开。可以用与sed相同的方式输入多重命令行:用分号分隔命令或使用Borune  shell的多行输入功能。


awk  -f   script  files


出错信息:

1.没有用大括号将整个过程括起来

2.没有用单引号''将指令括起来

3.没有用斜杠//中将正则表达式括起来


选项总结:

-f    跟随脚本的文本名

-F    改变字段分隔符

-v    跟随var=vallue




同时使用sed和awk:

[root@master sedawk]# vim nameState

s/ CA/, California/

s/ MA/, Massachusetts/

s/ OK/, Oklahoma/

s/ PA/, Pennsylvania/

s/ VA/, Virginia/                                            

[root@master sedawk]# sed -f nameState list

John Daggett, 341 King Road, Plymouth, Massachusetts

Alice Ford, 22 east Broadway, Richmond, Virginia

Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma

Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania

Eric Adams, 20 Post Road, Sudbury, Massachusetts

Hubert Sims, 328A Brook Road, Roanoke, Virginia

amy Wilde, 334 Bayshore Pkwy, Mountain View, California

Sal Carpenter, 73 6th Street,Boston, Massachusetts

[root@master sedawk]# sed -f nameState list | awk -F, '{print $4}'

 Massachusetts

 Virginia

 Oklahoma

 Pennsylvania

 Massachusetts

 Virginia

 California

 Massachusetts

补充:

    s/regular/complex

由于没有指定地址,所以它只影响当前行上的第一次出现。如果在当前行没有找到regular,则出现一个错误。为了寻找同一行上的多次出现,必须指定g。

    /regular/s/regular/complex/g

这个命令影响文件中与这个地址匹配的第一行。第一个regular,是一个地址,第二个是匹配替换命令的模式,要将它应用到所有的行,必须使用全局命令,在地址前放置g。

    g/regular/s/regular/complex/g

g的含义是不同的,第一个g是全局命令,意味着对所有与地址匹配的行进行改变,结尾处的g是一个标志,改变当前行所有的出现。