sed和awk学习整理

Awk和Sed的基本使用
 
能够用大至相同的方式调用sed 和awk 。命令行讲法是:
command [options] script filename
几乎和全部的unlx程序同样,sed和awk均可以从标准输入中取得输入并将输出发送到标准输出。若是指定文件名filename,输入就取自那个文件。输出包含处理后的信息。标准输出是指屏幕,并且通常来自这些程序的输出都输出到那里。输出也可被送到一个文件。例如she11中的I/O重定向,可是不容许送到向程序提供输入的同一个文件。每一个命令的options是不一样的。
 
scipt指定了要执行的指令。若是在命令行上script,假如它包含有能够由she11解释的空格或任意字符(例如$和*),那么它必须用单引号括起。
 
sed和awk一个共同的选项是-f选项,这个选项容许你指定脚本文件的名字。附着脚本大小的增加,将它放置在文件中比较方便。所以,能够按以下方式调用sed:
sed -f scriptfile inputfile
 
在sed和awk中,每一个指令都包括两个部分:模式和过程。模式是由斜杠(/)分隔的正则表达式。过程指定一个或多个将被执行的动做。
 
sed:
 
只有在命令行上给出多个指令时才须要用-e选项。它告诉sed将一下参数解释为指令。当只有一个指令时,sed能够本身作决定。
sed [-e] 'instruction' file
 
并非在任何状况下都须要将指令用单引号包围起来,可是你应该养成这个习惯。使用单引号能够阻止she11解释编辑指令中的特殊字符或空格(she11使用空格决定才是交给程序独立参数,特殊的she11字符在调用以前被展开)。
[root@ds-education2 ~]# cat test
John Daggett, 341 King Road, Plymouth MA
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MA
[root@ds-education2 ~]# sed 's/MA/MACK/' test  //该指令只影响了3 行,但显示出了全部行。
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
 
有3 种方式能够指定命令行上的多重指令:
一、
[root@ds-education2 ~]# sed 's/MA/MACK/; s/VA/VACK/' test  //使用;号处理
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VACK
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VACK
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
二、
[root@ds-education2 ~]# sed  -e 's/MA/MACK/' -e  's/VA/VACK/' test //使用-e选项来实现
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VACK
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VACK
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
三、
[root@ds-education2 ~]# sed '
> s/MA/MACK/
> s/PA/PACK/
> s/CA/CACK/' test    //输入sed '以后回车便可,这种技术在C she11中不能使用。
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
 
显示在屏幕上的结果是临时的,输入文件中没有发生改变!!!
 
sed后接脚本文件:
sed -f script file
[root@ds-education2 ~]# cat sed_test
s/MA/MACK/
s/PA/PACK/
s/CA/CACK/
[root@ds-education2 ~]# sed -f sed_test test
John Daggett, 341 King Road, Plymouth MACK
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
 
保存输出:
[root@ds-education2 ~]# sed -f sed_test test  > sed_write  //使用重定向便可
[root@ds-education2 ~]# cat sed_write
John Daggett, 341 King Road, Plymouth MACK MA
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
Eric Adams, 20 Post Road, Sudbury MACK
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
 
阻止输入行的自动输出:
sed的默认操做是输出每一个输入行。-n选项能够阻止自动输出。当指定该选项时,每一个要生成输出的指令都必须包含打印命令p
[root@ds-education2 ~]# sed -n 's/MA/MACK/'  test  //接-n就不输出了
[root@ds-education2 ~]# sed -n 's/MA/MACK/p' test //加上p后,被处理的行都被输出了
John Daggett, 342 King Road, Plymouth MACK
Eric Adams, 20 Post Road, Sudbury MACK
Sal Carpenter, 73 6th Street, 8oston MACK
[root@ds-education2 ~]#
 
sed的命令选项:
选项描述
-e 编辑随后的指令
-f 跟随脚本中的文件名
-n 阻止输入行的自动输出
 
Awk
每次从一个或多个文件中读入一行或从标准输入中读入一行。指令必须包含在单引号中,从而与shell区别开(指令几乎老是包含大括号和/或美圆符号,she11将它们解释为特殊符号)。能够用与sed相同的方式输入多重命令行:用分号分隔命令或使用Boruneshell的多行输入功能。
尽管awk指令与sed指令的结构相同,都由模式和过程两部分组成,但过程自己有很大的不一样。awk看上去不像编辑器而更像一种程序设计语言。语句和函数取代了使用一个或两二个字符组成的命令序列。例如,使用print语句打印表达式的值或打印当前输入行的内容。
在一般状况下,awk将每一个输入行解释为一条记录而将一行上的每一个单词(由空格或制表符分隔)解释为每个字段(能够改变这些默认设置)。一个或多个连续的空格或制表符看作一个定界符。awk容许在模式或过程当中引用这些字段。$0表明整个记录。
[root@ds-education2 ~]# cat test
John Daggett, 342 King Road, Plymouth MA
AI ice Ford, 22 East 8roadway, Richmond VA
Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A 8rook Road, Roanoke VA
Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, 8oston MA
[root@ds-education2 ~]# awk '{ print $1 }' test //用于打印输入文件中每行的第一个字段。
John
AI
Orvi
Terry
Eric
Hubert
Amy
Sal
[root@ds-education2 ~]#
 
"$1" 表示每一个输入行上的第一个字段的值。由于这里没有指定模式,因此打印语句应用于全部的行。下一个示例指定了"/MA/"模式,可是其中没有过程。这个默认操做是打印匹配这种模式的每一行。
[root@ds-education2 ~]# awk '/MA/' test  //这个默认操做是打印匹配MA这种模式的每一行
John Daggett, 342 King Road, Plymouth MA
Eric Adams, 20 Post Road, Sudbury MA
Sal Carpenter, 73 6th Street, 8oston MA
[root@ds-education2 ~]#
[root@ds-education2 ~]# awk '/MA/ { print $1 }' test  //打印出含有MA的行的第一字段(默认空格或者制表符隔开)
John
Eric
Sal
[root@ds-education2 ~]#
 
使用-F选项将字段分隔符改变为逗号
[root@ds-education2 ~]# awk -F, '/MA/ { print $1 }' test
John Daggett
Eric Adams
Sal Carpenter
[root@ds-education2 ~]#
 
[root@ds-education2 ~]# cat test1
taobao,facebook,baidu
google,sina,sohu
wangyi,shengda,51cto
[root@ds-education2 ~]# awk -F, ' { print $1 }; { print $2 }; {print $3} ' test1
taobao
facebook
baidu
google
sina
sohu
wangyi
shengda
51cto
[root@ds-education2 ~]#
 
awk的命令行选项:
-f 跟随脚本的文本名
-F 改变字段分隔符
-v 跟随var=value
 
Awk和Sed经过管道配合使用:
[root@ds-education2 ~]# cat test1
taobao,facebook,baidu
google,sina,sohu
wangyi,shengda,51cto
[root@ds-education2 ~]# cat sed_test1
s/taobao/TAOBAO/
s/google/GOOGLE/
s/wangyi/WANGYI/
[root@ds-education2 ~]# sed -f sed_test1 test1 | awk -F, '{ print $1 } '
TAOBAO
GOOGLE
WANGYI
[root@ds-education2 ~]#linux

 

转自:“枯木的Linux博客”正则表达式

相关文章
相关标签/搜索