Linux工具之grep&&sed&&awk

grep:

      grep是一种行过滤工具,我们经常会用grep在一个文件中找出包含某些字符串的行,比如在头文件中中找出一个宏定义。但是grep还可以找出符合某个模式(Pattern)的一类字符串。

 grep的一般格式为:grep  [选项]  基本正则表达式  [文件]

常用的grep选项有:

-E:扩展正则匹配

-R:递归是查询

-i:忽略大小写

-q:安静模式匹配,不显示,若查看是否匹配成功,则使用echo $?查看退出码

-c:只输出匹配行的计数

-n:显示匹配行及行号

-v:显示匹配行及行号

正则表达式:字符文本模糊匹配的算法。对字符串特点的一种描述。包含字符类,数量限定符,位置限定符,其他特殊字符。规定一些特殊语法表示字符类,数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式。

字符类:它们在模式中表示一个字符,但是取值范围是一类字符中的任意一个。


数量限定符:例如邮件地址的每一个部分可以有一个或多个x字符,IP地址的每一部分可以有1-3个y字符。


位置限定符:描述各种字符类以及普通字符之间的位置关系,例如邮件地址分三部分,用普通字符@和.隔开,IP地址分四部分,用.隔开,每一个部分都可以用字符类和数量限定符描述。


其他特殊字符:

上面介绍的是grep正则表达式的Extended规范,Basic规范也有这些语法,只是字符?+{}|()应该解释为普通字符,要表示上述特殊含义则需要加\转义。如果用grep而不是egrep,并且不加-E参数,则应该遵照Basic规范来写正则表达式。这里的egrep相当于grep -E。grep的正则表达式有Basic和Extended两种规范。后面将会解释。

注意,正则表达式参数用单引号括起来,因为正则表达式中用到的很多特殊字符在Shell中也有特殊含义(例如\),只有用单引号括起来才能保证这些字符原封不动地传给grep命令,而不会被Shell解释掉。

下面我们来看一下grep使用的例子

//创建一个文件file,file里保存下列数据

123
1456
192.168.0.1
123456789@qq.com
1111111
2222222
3333333
4444444
我们来看如何grep来查找匹配这些数据


以上就是grep的一些应用,很多还需要自己下去练习,关于grep的用法就先介绍到这里。

sed

       sed意为流式编译器,在shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输入引入sed的输入,经过一系列编辑命令转换为另一种格式输出。在默认情况下以basic规范进行匹配。

sed命令行的基本格式为:

sed option 'script' file1 file2

sed option -f scriptfile file1 file2

sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以一次传入多个文件,sed会依次处理。sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文件然后用-f参数指定,编辑命令的格式为/pattern/action。

其中pattern是正则表达式,action是编辑操作。sed程序一行一行读出带处理文件,如果某一行与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。

sed是一种在线编译器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区中的内容送往屏幕。接着处理下一行,这样不断的重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作。

sed操作实例:

1./pattern/p/:打印匹配pattern行

使用p命令需要注意:sed是把待处理文件的内容连同处理结果一起输出到标准输出的,因此p命令表示除了把文件内容打印出来之外还额外打印一遍匹配pattern的行。要想只输出处理结果应加上-n选项,这种用法相当于grep命令。

2./pattern/d:删除匹配pattern的行,但sed命令不会修改原文件,删除命令只表示某些 行不打印输出,而不是从原文件中删去。

3./pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2。

4./pattern/s/pattern1/pattern2/g:查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2。

5.sed -i:加上-i选项做的操作不仅打印,而且会修改原文件。

6.定址:定址用于决定对哪些行进行编辑。地址的形式可以是数字,正则表达式,或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

7.命令和选项:sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。

a\:在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行。

c\:用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用“\”续行。

i\:在当前行之前插入文本。多行时除最后一行外,每行末尾需要用“\”续行d删除行。

h:把模式空间的内容复制到暂存缓冲区。

H:把模式空间里的内容追加到暂存缓冲区。

g:把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容。

G:把暂存缓冲区的内容追加到模式空间里,追加在原有内容后面。

I:列出非打印字符。

p:打印行。

q:结束或退出sed。

r:从文件中读取输入行。

!:对所选行以外的所有行应用命令。

s:用一个字符串替换另一个。

g:在行内进行全局替换。

w:将所选的行写入文件。

x:交换暂存缓冲区与模式空间的内容。

y:将字符替换为另一字符(不能对正则表达式使用y命令)。

选项

-e:进行多项编辑,即对输入行应用多条sed命令时使用。

-n:取消默认的输出。

-f:指定sed脚本的文件名。

8.退出状态:sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。

与grep一样,sed也支持特殊元字符,来进行模式查找,替换。不同的是,sed使用的正则表达式是括在斜杠线“/”之间的模式。

模式空间保持空间

sed在正常情况下,将处理的行读入模式空间,脚本中的sed命令就一条接着一条进行处理。直到脚本执行完毕。然后该行被输出,模式被清空;接着,再重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

一般情况下,数据的处理只使用模式空间,按照上面的逻辑即可完成主要任务。

模式空间:可以想象成工程里面的流水线,数据直接在它上面进行处理。

保持空间:可以想象成仓库,我们进行数据处理的时候,作为数据的暂存区域。正常情况下,如果不显示使用某些高级命令,保持空间不会使用到。

sed高级命令:

g:将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除。

G:将hold space中的内容append到pattern space\n后。

h:将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除。

H:将pattern space中的内容append到hold space\n后。

d:删除pattern中的所有行,并读入下一新行到pattren中。

D:删除multilne pattern中的第一行,不读入下一行。

x:交换保持空间和模式空间的内容。

下面举几个例子来对上面命令应用一下:

给每行结尾添加一空行


用sed模拟出tac的功能


1!G代表第一行不执行“G”命令,从第2行开始执行。$!d,最后一行不删除(保留最后一行)

行列转化


H表示把pattern space的内容追加到hold space中去,H可以带一个地址,这里用的是$,表示到文件的末尾,然后将用x将之取到pattern space中,把\n替换成空格在打印即可。

求1~100的求和


打印奇偶数行


以上就是我们对sed做的简单介绍,下面我们来看最后一个工具。

awk

行有行分隔符,列有列分隔符,我们把一行内容可以称之为一条记录,用列分隔符分隔的一条信息称为域。sed以行为单位处理文件,awk比sed强的地方在于不仅能以行为单位处理文件还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义,比如/etc/passwd文件的每一行有若干个字段,字段之间以:分隔,就可以重新定义awk的列分隔符为:并以列为单位处理这个文件。awk基本用法和sed类似,awk命令行的基本形式为:

awk option 'script' file1 file2...

awk option -f scriptfile file1 file2...

和sed一样,awk处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接当命令行参数传入,也可以用-f参数指定一个脚本文件,编辑命令格式为:/pattern/{actions}

和sed类似,pattern是正则表达式,actions是一系列操作。awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。如下图:


awk调用方式

1.命令行方式

awk  [-F  field-separator]  'commands'  input-file(s)

其中,commands是真正的awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

2.shell脚本方式

将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。相当于shell脚本首行的:

#!/bin/awk -f 可以换成:#!/bin/awk -f

3.将所有的awk命令插入一个单独文件,然后调用:

awk  -f  awk-script-file  input-file(s)

其中,-f选项加载awk-script-file中的awk脚本,input-file(s)为待处理文件。

awk调用正则表达式方法

1.awk语句:

awk '/REG/{action}'

/REG/为正则表达式,可以将$0中,满足条件记录送入到:action进行处理

例如:awk  '/^a,*n$/{print $0;}'  file 在文件file中匹配以a开头,以n结尾的任意字符序列

2.awk正则运算语句(~,~! 等同 !~)

3.awk内置使用正则表达式函数

gsub(Ere,Repl,[In])    sub(Ere,Repl,[In])   match(String,Ere)   split(String,A,[Ere])

BEGIN和END

awk工作流程是这样:先执行BEGIN,然后读取文件,读入有\n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录,直到所有的记录都读完,最后执行END操作。且BEGIN和END可省略。

print和printf

awk中同时提供了print和printf两种打印输出的函数。

其中print函数的参数可以是变量,数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。

printf函数,其用法和C语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值