Linux操作系统操作系统三剑客awk、grep、sed详解
2024-01-16 13:13:19来源:西游留学网作者:弃权 阅读量:7733
一、前言linux中有很多可以处理文本的工具。 例如sort、cut、split、join、paste、comm、uniq、column、rev、tac、tr、nl、pr、head、tail .
使用这三种工具,无需记住以上不同的命令和参数,就可以解决Linux系统中近99%的文本处理问题。
() )
而且,如果已经记住了三个并使用了的话,就知道其中的区别了。
事实上,这里的差异意味着哪些工具擅长解决哪些问题。
一种更懒惰的方法是学习脚本语言( python、perl或ruby ),并使用它进行每个文本处理。
二、概要awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一。
三个功能都是处理文本,但侧重点各不相同,其中awk功能最强大,但也最复杂。
grep适合于简单地查找或匹配文本,sed适合于编辑匹配文本,而awk适合于格式化文本或以更复杂的格式处理文本。
简要概述:
( grep )数据搜索位置awk )数据片sed )数据修改3、grep=globalregularexpressionprint在最简单的术语中,grep )命令用于在文件中搜索满足条件的字符串
从文件的第一行开始,grep将一行复制到buffer中,与搜索字符串进行比较,如果比较通过,则在屏幕上打印该行。
grep将重复此过程,直到文件搜索所有行。
请注意,此处没有运行正规存储行、更改行或仅查找某些行的过程。
1、请剪切样本数据文件以下的数据,粘贴到名为“sampler.log”的文件中。
bootbookboozemachinebootsbungiebarkaardvarkbroken $ tuff robots 2,作为简单示例的grep的最简单示例如下。
grep 'boo' sampler.log在此示例中,grep扫描文件“sampler.log”中的每行,并打印每行包含单词“boo”。
bootbookboozeboots,如果您正在处理大型文件,则会出现这种情况。 如果这些行标识了文件中的哪一行,它们是什么,可能会更方便。 如果需要在编辑器中打开文件,则更容易跟踪对特定字符串所做的更改。
这可以通过添加-n参数来实现。
grep -n 'boo' sampler.log这将产生更有用的结果来说明与搜索字符串匹配的行。
1:boot2:book3:booze5:boots的另一个有趣参数是-v,打印相反的结果。
这意味着正则表达式将打印与搜索字符串不匹配的所有行。 不是打印一致的行。
在以下情况下,正则表达式将打印不包含字符串" boo "的每行,并显示行号,如上例所示
grep-VN ' boo ' sampler.log4: machine6: bungie7: bark8: aardvark9: broken $ tuf F10:robotsc选项传输禁止打印与grep匹配的行
例如,由于sampler.log中有四个显示“boo”,因此在下面打印数字4。
grep -c 'boo' sampler.log 4l选项仅打印查询中与搜索匹配的行的文件的文件名字符串。
如果要在多个文件中查找同一字符串,这将非常有用。
是这样的:
查找grep -l 'boo' *代码以外的文件时,有一个更方便的选项:-i,忽略大小写。
此选项将处理匹配搜索字符串时的大小写。
在以下示例中,即使搜索字符串是大写的,也会打印包含" boo "的行。
grep-I ' boo ' sampler.logbootbookboozebootsx选项只是精确匹配。
也就是说,以下命令没有搜索结果,因为没有只包含“boo”的行
grep -x 'boo' sampler.log最后,可以使用-A指定其他上下文文件行。 这样可以得到以下搜索字符串中的外行
grep-a2 ' mach ' sampler.logmachinebootsbungie 3,正则表达式正则表达式是一种描述文本中复杂模式的紧凑方法。
有了grep就可以使用搜索模式( pattern )。
其他工具使用正则表达式( regexp )以复杂的方式。
grep使用的普通字符串实际上是一个非常简单的正则表达式。
如果要使用通配符(如“*”或“”),例如文件名列表,则可以使用正则表达式来查找以字符e结尾的文件行。
grep ' e $ ' sampler.logboozemachinebungie如果需要更广泛的正则表达式命令,则必须使用grep -E。
例如,正则表达式命令与出现一次或零次之前的字符相匹配。
也可以使用grep-e ' boots ' sampler.logbootbootspipe (|)组合多个搜索。 这意味着“或”,因此您可以:
grep-e ' boots ' sampler.logbootboots 4、如果想搜索特殊字符是特殊字符,该怎么办? 如果要找到所有直线,并且包含美元字符“$”,则无法执行grep“$”a _ file。 是为了“$”
解决方案是转义符号,因此使用
也可以使用-F选项只搜索字符串,而不搜索grep '$' sampler.log broken$tuff正则表达式。
5、更多regexp示例参考:
四. AWK由Aho、Weinberger和Kernighan制作的文本模式扫描和语言处理。
因为AWK非常复杂,所以这不是完整的指导方针,但是应该给你一个知道你能做什么的AWK。
因为容易使用,所以强烈推荐。
1、AWK基础知识AWK程序操作输入文件的每行。
在处理文件内容之前,可选的BEGIN{ }部分包含要执行的命令,在文件的每一行中执行主部分,最后执行可选的END{ }部分以完成文件读取。
begin {……initializationawkcommands…} {…. awkcommandsforeachlineofthefile…} end {…. finalizationawkcommands }
这些" pattern-matching "命令可以包含与grep相同的正则表达式。
A
wk命令可以进行非常复杂的数学和字符串操作,awk也支持关联数组。
在AWK中,每行由多个字段组成,每个字段被视为由“空格”分隔。
默认情况下,这是一个或多个空白字符,因此行如下所示:
this is a line of text包含六个字段。
在awk中,第一个字段称为2、等等,所有行都称为$0。
由于字段分隔符由awk内部变量FS设定,因此如果设定FS=“:”,则会根据“:”的位置分割为一行。 这对于/etc/passwd等文件很有用。 其他有用的内部变量是NR。 也就是说,当前记录编号,即行号NF是当前行的字段数。
AWK可以对包括std-in在内的任何文件进行操作。 在这种情况下,通常与'|'命令一起使用。 例如,与grep和其他命令组合。
例如,如果列出当前目录中的所有文件
ls -l总用量140-rw-r--r-- 1 root root 55121 1月3日17:03 combined _ log _ format.log-rw-r---1 root root 8064441月3日
如果想知道它们的总大小,可以创建此目录的文件。
打印ls-l|awk ' begin { sum=0} { sum=sum $5} end { printsum} } ' 135836变量sum的值,如果sum=2,请注意' printsum '
因此,可以很容易地编写awk命令来计算平均值和数字列的标准偏差。 在主要内部积累' sum_x '和' sum_x2 '的部分,使用标准公式计算END部分的平均值和标准偏差。
AWK支持“for”和“while”)循环和分支。 使用“if”。
因此,如果您希望裁剪文件并对每第三行进行操作,可以执行以下操作:
ls-l|awk'{for(I=1; i3; I ) {getline}; print NR,$0}'3 -rw-r--r-- 1 root root 80644 1月3日17:03 combined _ log _ format _ w _ resp _ time.log4- rw-r
最后一个命令提前完成,因为文件行数为4且不能被3整除。 因此,最后一个" print $0"命令将打印第四行。 可以看到我们也打印行,使用NR变量输出行号。
2、AWK模式匹配AWK是一种面向低的语言。
首先是模式,然后是动作。
操作语句用{ and }括起来。
有可能缺少模式或者缺少动作,但当然不是都。
如果没有模式,请对每个输入记录执行操作。
丢失的动作将打印整个记录。
AWK模式包括使用与" grep -E "相同语法的正则表达式,以及"逻辑AND "、"|| "为"逻辑或"、"! 表示”的特殊符号组合,意思是“逻辑上不”。
也可以是关系模型、阵列组、范围等。
3、AWK控制语句if(condition ) statement [ else statement ] while ( condition ) statementdostatementwhile ( condition ) for ) expr 1 expr3) statementfor(varinarray ) statementbreakcontinuexit [ expression ] 4、AWK输入输出语句
注意:通过printf命令,可以使用类似c的语法更严格地指定输出格式。 例如,可以指定指定宽度的整数、浮点数、字符串等。
5、AWK数学函数
6、AWK字符串函数
7、AWK命令行和用法根据需要可以多次使用“-v”标志将变量传递给AWK程序。 例如
awk-vskip=3'{for(I=1; 也可以使用I编辑器创建awk程序,并将其另存为脚本文件。 例如:
$ cat awk_strip#!/usr/bin/awk-f # onlyprintoutevery3rdlineofinputfilebegin { skip=3} { for ( I=1; I可以作为新的附加命令使用
chmoduxawk _ strip./awk _ strip sampler.dat五、sed=stream editorsed对输入流(来自文件或管道的输入)执行基本的文本转换单遍
但是,sed可以通过管道过滤文本,特别是将其与其他类型的编辑器区分开来。
1、可以在命令行或shell脚本中使用基于sed的sed来交互式编辑文件。
最有用的功能可能是“查找”和替换一个字符串。
可以在调用sed的命令行中使用“-e”选项嵌入sed命令,也可以将其放入另一个名为“sed.in”的文件中,然后使用“-f sed.in”选项调用sed。
后一种选择最常用于sed命令复杂且涉及大量regexp的情况! 例如:
sed-e ' s/input/output/' sampler.logbootbookboozemachinebootsbungiebarkaardvarkbroken $ tuff robots从sampler.log返回
因为sed是面向行的,所以如果要更改每行中的所有事件,必须按如下所示进行“贪婪”搜索和替换:
sed-e ' s/input/output/g ' sampler.logbootbookboozemachinebootsbungiebarkaardvarkbroken $ tuff robots/. /的表达式为字符
缺省情况下,输出写入stdout。
可以重定向到新文件。 或者,如果要编辑现有文件,则必须使用“-i”标志。
在sed-e ' s/input/output/' sampler.log new _ files ed-I-e ' s/input/output/' sampler.log2,sed,正则表达式搜索命令中然后你必须像grep (和awk )那样转义符号。
如果您要编辑shell脚本以引用/usr/local/bin而不是/bin,则可以这样做
如果要在sed-e ' s//bin//usr/local/bin/' my _ script new _ script搜索中使用通配符字符串-如何创建输出字符串? 与找到的模式对应的特殊符号“&; 中的地图册条目上单击鼠标右键。
所以,我想用你文件中的数字开始每一行,并用括号把这个数字括起来。
sed -e 's/[0-9]*/( )/),其中[0-9]是所有位的regexp范围,' * '是表示任意数字位数的重复计数。
也可以在regexp中使用位置命令。 也可以将部分匹配的结果保存在图案缓冲区中,以便在其他地方重复使用。
六.其他SED指令的一般形式为
sed-e '/pattern/command ' sampler.log其中' pattern '是正则表达式,' command '是' s'=search&; replace、' p'=print、或' p'=print、或
由于缺省操作是打印所有内容,因此如果要避免打印,必须使用'-n '标志调用sed,并使用' p '命令控制打印内容。
所以,如果你想列出所有的列表,就创建一个可以使用的子目录
ls -l | sed -n -e '/^d/p '长列表的开头每行都有' d '符号。 如果这是目录,则只打印以“d”符号开头的行。
同样,要删除以注释符号“#”开头的所有行时可以使用
sed -e '/^#/d' sampler.log也可以使用范围表单
sed-e ' 1,100 command ' sampler.log在第1-100行执行“命令”。
也可以用特殊的行号$表示“结束”文件。
因此,如果要删除文件的前10行以外的所有行,可以使用
也可以使用sed -e '11,$ d' sampler.log模式范围表单。 其中,第一个正则表达式定义范围的开始和第二次停止。
因此,例如,如果要打印从' boot '到' machine '的所有行,您可以:
sed -n -e '/boot$/,/mach/p ' sampler.logbootbookboozemachine只打印regexp指定范围内的行。
1、使用sed可以做的事情还有很多。 具体参考: http://liuxuetime/Unix/Sed.html
七、总结Linux三剑客awk,sed和grep广泛应用于性能领域,包括性能建模、性能监测和性能分析等方面,也是各大互联网公司测试岗高频面试问题,中高级测试人员必备的技能之一。
相关文章
-
三段话留学家长都清楚:SAT、托福、GRE是什么?
什么是 SAT 俗称:美国高考。全称是 Scholastic Assessment Test;翻译过来就就是:学术评估测试。谁组织的?...
阅读: 6812
-
gre考试是什么意思,gre考试是什么意思啊
本文老师带来了gre考试是什么意思介绍,文中内容也只是让考生们当作参考来进行学习,期望会对考生们更多了解GRE带来一定的帮助。gre考...
阅读: 5942
-
12月即将迎来考试季。你知道每次考试的日期吗?我希望你们都通过了。
12月1日-10日国际内审师、12月1、7、8、14、21日托福、12月7、12、14日雅思(IELTS)12月1日2020国家公务员...
阅读: 17455
-
雅思,托福,GRE又要取消5月的考试了。准留学党会成为“辍学青年”吗?
就在刚刚,中国教育考试网发布通知,宣布取消5月份雅思、托福、GRE、GMAT等海外考试!而雅思和托福的官方微博也确认了这一消息,宣布取...
阅读: 11657
-
为什么GRE考试题比我练的机修课难那么多?
近期巍哥经常被刚开始上课的学生问到这样一个问题:老师,为什么我考试的时候碰到的题比我平时做的真题难很多?更有甚者说:老师,我平时做完整...
阅读: 14863
-
GRE报名官网是哪个?报名GRE需要参加搜索服务吗?
各位同学们,大家都知道,GRE报名是GRE考试中必不可少的一步,其在重要性不言而喻。GRE报名的网站大家应该都已经清楚了,国内的考生的...
阅读: 5723
-
如何选择GRE GMAT?这四个因素让你不再纠结。
就读商科的学生,应该怎么选择GRE和GMAT考试,可以结合以下四大因素综合考虑。下面和美藤国际教育小编一起来看看!一、考试介绍1.GR...
阅读: 19354
-
突发:NEEA 8月临时取消14个托福考点。
ETS今日突发通知:【重要通知】根据教育部当前针对新型冠状病毒感染肺炎疫情防控的相关要求,以下部分考点决定取消中国大陆地区近期安排的托...
阅读: 11680
更多排行榜
热门文章
1.GRE在线考试记录|最新考试经验分享
- 1
- GRE在线考试记录|最新考试经验分享
- 2024-01-05
2.昨天托福考试位置秒售罄,那些说留学坏话的人又被打脸了。
- 2
- 昨天托福考试位置秒售罄,那些说留学坏话的人又被打脸了。
- 2023-11-16
3.2022年下半年考试时间,2022年下半年考试时间表
- 3
- 2022年下半年考试时间,2022年下半年考试时间表
- 2023-11-18
4.英国留学申请材料加GRE?这些大学已经发布了官方通知。
- 4
- 英国留学申请材料加GRE?这些大学已经发布了官方通知。
- 2023-11-20
5.多林哥考试难度适应性考试机制全解析——不同环节试题难度差异
- 5
- 多林哥考试难度适应性考试机制全解析——不同环节试题难度差异
- 2023-11-11
6.GRE成绩怎么算,gre考试多少分合格
- 6
- GRE成绩怎么算,gre考试多少分合格
- 2023-11-15
7.考试前一定要考GRE模考吗?GRE模考培养什么能力?
- 7
- 考试前一定要考GRE模考吗?GRE模考培养什么能力?
- 2024-01-03
8.美国研究生院,GRE常识错误描述
- 8
- 美国研究生院,GRE常识错误描述
- 2023-12-01
9.托福\u0026 GRE通过ETS送分是怎么回事?
- 9
- 托福\u0026 GRE通过ETS送分是怎么回事?
- 2023-12-24
10.gre考试为什么查不到成绩,gre考试未进考场
- 10
- gre考试为什么查不到成绩,gre考试未进考场
- 2023-12-01
一周热榜
-
立正!自2022年11月起,GRE考试费全球上涨。
2023-11-03
-
讲完整个故事!GRE考试,那些你需要知道的干货
2023-11-04
-
想出国留学,GRE和GMAT选哪个好?
2023-11-04
-
ETS官方:11月1日提高GRE考试费用。
2023-11-04
-
GRE需要多长时间,考试包括哪些内容?
2023-11-04