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 种方式可以指定命令行上的多重指令:
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学习整理的更多相关文章
- sed and awk学习笔记
sed and awk 背景 awk起源追溯至sed和grep,进而追溯至共同的行编辑器ed.实用工具grep来源于ed命令:g/re/p .实用工具awk和sed有一个共同的选项-f用于指定脚本的名 ...
- grep,sed,awk用法整理
grep -c 打印出符合要求的行数 -i 忽略大小写 ignore -n 连同符号一起输出 num -v 打印出不符合要求的行 -A2 本行及下面两行 - ...
- sed、awk学习篇
[yongsan@yz6245 ~]$ awk 'BEGIN {FS=":"}{shells[$NF]++;}END{for(i in shells)print i ": ...
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- sh脚本学习之: sh脚本 、sed、awk
sh脚本 sh命令的批处理文件,支持更复杂的逻辑. Shell中的变量 参数 $0 当前脚本路径 $1....$n 脚本执行对应的第n个参数 条件判断 文件判断 test [op] path e存在 ...
- 正则表达式学习之grep,sed和awk
正则表达式是用于描述字符排列和匹配模式的一种语法,它主要用于字符串的模式分割.匹配.查找以及替换操作. 描述一个正则表达式需要字符类.数量限定符.位置限定符.规定一些特殊语法表示字符类,数量限定符和位 ...
- Linux基础-正则表达式整理---------------grep、sed、awk
目录: Ⅰ:正则表达式 Ⅱ:作业 Ⅰ:正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在lin ...
- 【转】awk学习笔记
Awk学习笔记 整理:Jims of 肥肥世家 <jims.yang@gmail.com> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2 ...
- awk 学习笔记
awk的语法有两种形式 awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) 选 ...
随机推荐
- Linux入门练习2
export命令用来设置环境变量. 使用单引号时,变量不会被扩展,将依照原样显示.示例: 如果变量未定义过,则什么都不打印: 获得变量值长度 识别当前所使用得shell: 检查是否为超级用户: UID ...
- javascript 易错点、难点笔记
本文主要记录在学习过程中遇到的JavaScript难点或者容易疏忽的细节,也方便自己日后翻阅学习. 1.arr.length === + arr.length arr.length === + arr ...
- ASP.NET开发,从二层至三层,至面向对象 (3)
继续上一篇<ASP.NET开发,从二层至三层,至面向对象 (2)>http://www.cnblogs.com/insus/p/3825805.html .我们学会了怎样创建对象,把Biz ...
- 34.Linux-printk分析、使用__FILE__, __FUNCTION__, __LINE__ 调试
本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表 ...
- Eclipse 各种小图标的含意
- 虚拟机中安装完 CentOS7minimal 版本后无法联网的问题
问题描述 安装完系统后无法上网,然后进入到目录 /etc/sysconfig/network-script 查看.发现只有一个 ifcfg-lo. 解决办法 这种情况是没有识别到网卡. 在 VMwar ...
- jqgrid 获取当前页数据
/** *刷新,jqGrid刷新当前列表页代码 */ function refresh(url) { var page = $('#your_grid').getGridParam('page'); ...
- python去掉字符串中空格的方法
1.strip():把头和尾的空格去掉 2.lstrip():把左边的空格去掉 3.rstrip():把右边的空格去掉 4.replace('c1','c2'):把字符串里的c1替换成c2.故可以用r ...
- Python数据模型
引言 像大多数人一样,我在对一直传统的面向过程语言C一知半解之后,走进了面向对象的世界,尽管对OOP一无所知,还好Python还保留有函数式编程,这使得我才不那么抵触,直到现在,习惯了面向对象之后,也 ...
- python常用模块-01
1. 简单了解模块 写的每一个py文件都是一个模块. 还有一些我们一直在使用的模块 buildins 内置模块. print, input random 主要是和随机相关的内容 random() ...