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 种方式可以指定命令行上的多重指令:
1、
[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 ~]#
2、
[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 ~]#
3、
[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博客”

sed和awk学习整理的更多相关文章

  1. sed and awk学习笔记

    sed and awk 背景 awk起源追溯至sed和grep,进而追溯至共同的行编辑器ed.实用工具grep来源于ed命令:g/re/p .实用工具awk和sed有一个共同的选项-f用于指定脚本的名 ...

  2. grep,sed,awk用法整理

    grep -c 打印出符合要求的行数 -i 忽略大小写              ignore -n 连同符号一起输出          num -v 打印出不符合要求的行 -A2 本行及下面两行 - ...

  3. sed、awk学习篇

    [yongsan@yz6245 ~]$ awk 'BEGIN {FS=":"}{shells[$NF]++;}END{for(i in shells)print i ": ...

  4. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  5. sh脚本学习之: sh脚本 、sed、awk

    sh脚本 sh命令的批处理文件,支持更复杂的逻辑. Shell中的变量 参数 $0 当前脚本路径 $1....$n 脚本执行对应的第n个参数 条件判断 文件判断 test [op] path e存在 ...

  6. 正则表达式学习之grep,sed和awk

    正则表达式是用于描述字符排列和匹配模式的一种语法,它主要用于字符串的模式分割.匹配.查找以及替换操作. 描述一个正则表达式需要字符类.数量限定符.位置限定符.规定一些特殊语法表示字符类,数量限定符和位 ...

  7. Linux基础-正则表达式整理---------------grep、sed、awk

    目录:    Ⅰ:正则表达式    Ⅱ:作业 Ⅰ:正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在lin ...

  8. 【转】awk学习笔记

    Awk学习笔记 整理:Jims of 肥肥世家 <jims.yang@gmail.com> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2 ...

  9. awk 学习笔记

    awk的语法有两种形式 awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) 选 ...

随机推荐

  1. ApiGen 4.0配置项

    Usage: generate [-s|--source="..."] [-d|--destination="..."] [--access-levels=&q ...

  2. 文档数据库MongoDB

    MongoDB是一个基于分布式文件存储的文档式数据库.其由C++编写, 旨在为Web应用提供可扩展的高性能数据存储解决方案. MongoDB中每条数据记录被作为一个文档存储,文档由集合(collect ...

  3. [SPOJ 687]Repeats

    Description 题库链接 给出一个长度为 \(n\) 的字符串,求重复次数最多的连续重复子串. \(1\leq n\leq 50000\) Solution Code #include < ...

  4. Docker基础-端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时, ...

  5. Tomcat服务器的安装配置图文教程(推荐)

    现在将使用Tomcat的一些经验和心得写到这里,作为记录和备忘.如果有朋友看到,也请不吝赐教. 1.首先是Tomcat的获取和安装. 获取当然得上Apache的官方网站下载,开源免费,而且带宽也足够. ...

  6. 啰里吧嗦CountDownLatch

    java.util.concurrent Class CountDownLatch 目录 CountDownLatch 是什么 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等 ...

  7. Linux常用基本命令(split )

    split命令 作用:切割文件 格式: split [option] [input] [prefix] -l 指定分割后文件的最大行数 ghostwu@dev:~/linux/split$ cat - ...

  8. python中强大优雅的列表推导表达式

    推导表达式其实就是简化一些循环判断操作等 生成一个数字1-10的列表,可以有多少种方法? >>> l = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] > ...

  9. Three.js开发指南---粒子和粒子系统(第七章)

    使用粒子可以很容易的创建很多细小的物体,例如雨滴雪花等 本章主要内容: 1 使用ParticleBasicMaterial(基础粒子材质)来创建和设计粒子 2 使用ParticleSystem来创建一 ...

  10. windows 公司内部搭建禅道(项目管控)

    禅道的搭建异常爽快,非常方便,一般情况下我们使用开源版就可以了.下面是搭建流程,这里主要记录一些前期的注意事项 使用一键安装版就可以,很快,禅道安装主机安装好所需的Apache容器和mysql数据库, ...