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更加好用。