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. Spring Boot(三):Spring Boot 中 Redis 的使用

    Spring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化. Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更 ...

  2. U3D Input类之键位输入GetKey

    Input类中包含许多属性和方法,下面介绍一下和键盘输入有关的内容 一.有关接收键盘信息的属性 属性名 类型 属性类型 含义 anyKey bool get 当前是否按住任意键或鼠标按钮 anyKey ...

  3. jQuery加载部分视图(Partial Views)

    本篇是演示使用jQuery加载部分视图(Partial View).如果你不想使用Razor的语法呈现部分视图,那此篇的方法是最理想的了.它可以Render至指定的tag上. 创建两个部分视图,一个为 ...

  4. abp运行机制分析

    abp运行流程 由于公司现在大量向abp框架+react前后端分离架构转型,所以有必要分析abp框架是如何在iis运行的,所以才有这篇文章 public class MvcApplication : ...

  5. JavaScript 日期多加一天 方法

    今天查看项目发现有出bug,由于未了符合sql语句的要求,前台网页显示的时候传到后台的时候要+1天, 网上查看了别人写的,发现多多少少有点漏洞,经过我自己总结,写出了达到了我要求的 var str = ...

  6. 【转】classpath和环境变量设置

    http://www.360doc.com/content/12/0722/14/820209_225797366.shtml 在没有设置环境变量之前,我们可以通过直接在应用程序中加带相关信息来运行我 ...

  7. Java虚拟机 - Class类文件结构

    [深入Java虚拟机]之二:Class类文件结构 平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Jav ...

  8. 解决 iframe 后退不是主页面后退(浏览器 history)问题

    前言:项目中的主页面里有 iframe,切换 iframe 的 src 地址之后,再点浏览器的回退之后,会导致 iframe 里面回退,而不是主页面回退. 问题 浏览器机制的原因,在 iframe 导 ...

  9. POJ3281(KB11-B 最大流)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19170   Accepted: 8554 Descripti ...

  10. [SDOI2010]猪国杀

    题面 (这个做题面的大佬太赞啦) 无聊啊~~~然后就写大模拟,然后就从早上写到下午,生活得到了极大的充实 注意事项: 牌库为空之后再抽牌,会重复抽最后一张被抽走牌 无论在任何过程中,游戏结束(主公死或 ...