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%的文本处理问题。

Linux操作系统操作系统三剑客awk、grep、sed详解

() )

而且,如果已经记住了三个并使用了的话,就知道其中的区别了。

事实上,这里的差异意味着哪些工具擅长解决哪些问题。

一种更懒惰的方法是学习脚本语言( 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广泛应用于性能领域,包括性能建模、性能监测和性能分析等方面,也是各大互联网公司测试岗高频面试问题,中高级测试人员必备的技能之一。

相关文章

热门文章