sed和awk之sed篇(含sed高级用法)

(原创文章,谢绝转载~)

sed(stream editor)和 awk 是linux环境下处理文本、数据的强大“利器”,sed对数据列的处理稍逊,awk则更似一门语言,control flow的语法基本和c语言一样,能够处理复杂的逻辑,二者经常配合正则表达式使用。本文简述sed用法。

sed对输入流(文本数据)逐行处理,其基本格式为:

sed (OPTIONS...)  [SCRIPT] [INPUTFILE...]#examplessed ‘10d‘ test.txtsed -i ‘s/a/b/‘ test.txt

options 有常用的:-n(消除自动打印),-i (edited in-place),-e(--expression=script),-f (--file=script-file),--help 等。

sed的script部分的格式为:

(addr)X(options)

其中addr(address)部分我们可以指定处理某些行,若无指定,则sed将处理数据流中的所有行。

X为 sed 的命令,(options) 对某些sed 命令使用,sed 的常用命令有:d(删除),p(打印),l(unambiguous打印),s(替换),i(插入文本)等等。

其中替换是最为常用的命令之一,它的格式为:

s/regexp/replacement/(flags)#examplessed  ‘s/string/repalce/‘ test.txtsed  ‘s/^start_this/repalce/g‘ test.txt

其中g是最常用的flags,它的作用是替换所有匹配到的正则式,而非第一个(不加g时)。

sed 亦可以使用多条命令:

sed ‘1d
2d
3d‘

sed -e 1d -e 2d -e 3d

sed ‘1d;2d;3d‘

如上有多种方式执行多条命令,但需注意,用分号将命令隔开不适用于某些特殊的命令(a,c,i等),因为这些命令会将分号也视为文本而不是命令间的间隔。

接下来将说下 addr的用法,即指定行,指定行的方法有如下:

#单个数字指定,例如打印第2行
sed -n ‘2p‘
#fisrt~step,例如如下打印1,4,7,10,,,行(step为公差)
sed -n ‘1~3p‘
#正则筛选,例如如下打印end结尾行
sed -n ‘/end$/p‘
#范围(闭区间),范围间用逗号分隔,如下为打印2到8行
sed -n ‘2,8p‘
#范围配合正则使用,如下为打印2到匹配到正则那行
sed -n ‘2,/regexp/p‘

sed的正则表达式不赘述,和一般正则差异不大,稍有syntax调整,且regexp1\|regexp2 时也是从左至右优先。

下面说下sed的高级用法:

首先需要理解下sed的运行机制,sed具有两个数据缓存区,一个所谓pattern区,一个所谓hold区,一行数据过来在pattern区执行sed处理命令,然后默认输出pattern区的内容(除非 -n 消除自动打印),然后会清空pattern区(默认),进行下一行数据操作(下一次循环)。hold区可以在循环间保持住本区数据不删除,sed的一些命令可以在pattern区和hold区之间move data。

D: 删除pattern区数据直到第一个newline, 重启循环(此时不会清空pattern区数据)

G: 将hold区数据加到pattern区, 加之前加上newline(\n)

H: 将pattern区数据加到hold区,加之前加上newline(\n)

N: 输入流再加一行到pattern区,加之前加上newline(\n)

P: 打印pattern区数据,直到第一个newline(\n)

h: pattern区的数据替换hold区的数据

看具体例子:

[email protected]:~$ seq 5 |sed -n ‘N;l;D‘
1\n2$
2\n3$
3\n4$
4\n5$

N加上了\n和第二行2,于是打印出  1\n2$ ,再D删除掉 1和\n,pattern区于是剩下 2

如此继续,N加上了\n和第三行3,于是打印出  2\n3$ ,再D删除2和\n,pattern区剩下3。后面如前所述。

再如例子:文本按行倒序打印:

[email protected]:~$ seq 5 |sed -n ‘1!G;$p;h‘
5
4
3
2
1

第一行数据不执行G操作,不打印($p只打印最后一行输入),进入hold区(h操作),此时hold区数据为1

第二行数据2进入,将hold区数据1加入pattern区(G功能),此时pattern区为  2\n1,再转到hold区,此时hold区数据为 2\n1

第三行数据3进入,再将hold区 2\n1加入pattern区(G功能),此时pattern区为 3\n2\n1,再转到hold区,此时hold区数据为3\n2\n1

如此,最后一行结束时,打印出pattern区数据为上图倒序所示。

未完待续,后续将总结另一利器awk的处理数据列方面的用法~

时间: 2024-07-29 08:31:43

sed和awk之sed篇(含sed高级用法)的相关文章

Linux Shell之十 sed与awk

设计script时,有时候需要修改脚本,例如删除或置换某些关键词.像这种在script执行过程动态修改文件的做法,称为流编辑.具有流编辑能力的工具,称为流编辑器.sed是这方面的强者.另外script执行时可能要制作报表,呈现各字段信息,awk完美解决. 一.正则表达式 正则表达式是组成"样式"的基本语法,而"样式"是运用sed和awk必备的能力.sed和awk相同的运行方式是:只要符合"样式"的数据行,就对它执行指定的"操作"

sed、awk——运维必须掌握的两个工具

今天主要跟大家介绍2个非常霸道的工具,sed和awk,本篇文章将介绍这两个工具在日常运维中的常用用法,工作中这两个工具要掌握好了在结合一些管道命令.正则表达式,日常处理事务简直666啦! l Sed 1.强大的地方 擅长对数据行进行处理,sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非

grep,sed,awk

grep, sed 与 awk 相当有用 ! gerp 查找, sed 编辑, awk 根据内容分析并处理. awk(关键字:分析&处理) 一行一行的分析处理 awk '条件类型1{动作1}条件类型2{动作2}' filename, awk 也可以读取来自前一个指令的 standard input相对于sed常常用于一整行处理, awk则比较倾向于一行当中分成数个"字段"(区域)来处理, 默认的分隔符是空格键或tab键例如:last -n 5 | awk '{print $1

grep, sed 与 awk 详解

grep, sed 与 awk 相当有用 ! gerp 查找, sed 编辑, awk 根据内容分析并处理. awk(关键字:分析&处理) 一行一行的分析处理 awk '条件类型1{动作1}条件类型2{动作2}' filename, awk 也可以读取来自前一个指令的 standard input相对于sed常常用于一整行处理, awk则比较倾向于一行当中分成数个"字段"(区域)来处理, 默认的分隔符是空格键或tab键例如:last -n 5 | awk '{print $1

ci高级用法篇之扩展核心类

在上一篇文章ci高级用法篇之创建自己的类库中,你是否觉得每个控制器的构造方法都去执行校验代码其实违背了编程规范中的DRY(do'nt repeat yourself)原则呢? 其实我们完全可以把校验的代码在父类的构造函数中.ci中控制器的父类是CI_Controller,现在我们来扩展这个父类. 在application/core目录下创建一个类文件,MY_Controller.php,内容如下: <?php class MY_Controller extends ci_Controller{

sed和awk之awk篇

(原创文章,谢绝转载~) awk是处理文本的另一利器,也是对文本逐行处理.awk的基本syntax是: awk 'pattern {action} ' inputfile #examples awk '/regex/ { print $0 }' inputfile 在awk中用 $1,$2,$3.... 表示每行的第1,2,3....列,而 $0 表示整行数据 另有内置变量,借助awk的这些内置变量,可以非常方便的处理文本: NF ,列数(Number of Fileds),进而 $NF 为最后

日志分析查看——grep,sed,sort,awk运用

概述 我们日常应用中都离不开日志.可以说日志是我们在排查问题的一个重要依据.但是日志并不是写了就好了,当你想查看日志的时候,你会发现线上日志堆积的长度已经超越了你一行行浏览的耐性的极限了.于是,很有必要通过一些手段来高效地辅助你来快速的从日志中找到你要找的问题.本文通过一个从项目中衍生出来的例子从查找日志,筛选日志和统计日志3个方面层层递进来简述日志文件查看中一些有用的手段.(注:在linux环境下) 目录 0.查找关键日志grep 1.查找关键日志grep 2.精简日志内容 sed 3.对记录

Sed、Awk单行脚本快速参考

文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本中每一行后面将有且只有一空行. sed '/^$/d;G' awk '!/^$/{printf("%s\n\n",$0)}' # 在每一行后面增加两行空行 sed 'G;G' awk '{printf("%s\n\n\n",$0)}' # 将第一个脚本所产生的所有空行删

grep,sed,sort,awk运用

概述 我们日常应用中都离不开日志.可以说日志是我们在排查问题的一个重要依据.但是日志并不是写了就好了,当你想查看日志的时候,你会发现线上日志堆积的长度已经超越了你一行行浏览的耐性的极限了.于是,很有必要通过一些手段来高效地辅助你来快速的从日志中找到你要找的问题.本文通过一个从项目中衍生出来的例子从查找日志,筛选日志和统计日志3个方面层层递进来简述日志文件查看中一些有用的手段.(注:在linux环境下) 目录 0.查找关键日志grep 1.查找关键日志grep 2.精简日志内容 sed 3.对记录