在linux系统有被称为文本处理三剑客grep,sed,awk.
今天与大家分享的就是gerp和sed处理工具,至于awk,我将会在晚些的时间与大家分享,在分享grep和sed之前我先要和大家说说正则表达,正则表达是什么呢,正则表达式就像是三剑客手里的剑,没有剑哪还能称的上什么剑客,所以我们要先了解以下正则表达式的简单用法。
什么是正则表达式:
“正则表达式是描述一组字符窜特征的模式,用来匹配特定的字符串。“--Ken Thompson
基本正则表达式的元字符有以下这些:
. :匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
如:[a-z], [A-Z], [0-9], [a-z0-9]
[:upper:]:所有大写字母
[:lower:]:所有小写字母
[:alpha:]:所有字母
[:digit:]:所有数字
[:alnum:]:所有的字母和数字
[:space:]:所有空白字符
[:punct:]:所有标点符号
[^]:匹配指定范围外的任意单个字符;
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
*:匹配其前面的字符任意次;0,1,多次;
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
\+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,\}:至少m次
位置锚定:
^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
^PATTERN$:用于PATTERN来匹配整行;
^$:表示空白行;
^[[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\< 或 \b:词首锚定,用于单词模式的左侧;
\> 或 \b:词尾锚定,用于单词模式的右侧;
\<PATTERN\>:匹配完整单词;
好的现在可以介绍grep和sed了,grep是global searchregular expression(RE) and print out the line的缩写,光看名字这么长就知道这是一个很厉害的工具,嘿嘿,其实它能做到对用户所选择的过滤条件全文搜索匹配指定文件,并把相应的行显示出来,并且显示的是整行。也就是说只要有部分匹配就会整行显示。这个过滤条件可以是基本正则表达式或扩展正则表达式。正则表达式我也将会在晚些的博客中与大家分享。
grep的用法
grep[OPTIONS] PATTERN [FILE]...
grep[OPTIONS] [-e PATTERN | -f FILE] [FILE...]
这里的PATTERN就是过滤条件,加上-e参数后就可以匹配多个条件,后面的-f表示过滤条件可以从文件中读取。
PATTERN:可以是由正则表达式的元字符及文本字符所编写出的过滤条件。
常用选项如下:
--color=[always|never|auto]:对提配到的文本是否高亮显示;
-i:ignore-case,忽略字符大小写;
-o:仅显示匹配到的字符串本身,而不整行显示;
-v:显示能被匹配字符所在的行以外的所有行;
-E:支持扩展的正则表达式;
-q:静默模式,即匹配到字符,但不显示,一般用来判断文件是否存在;
-Anum:num用数字替换,表示显示匹配到的字符所在的行及后num行; -Bnum:num用数字替换,表示显示匹配到的字符所在的行及前num行:
-Cnum:num用数字替换,表示显示匹配到的字符所在的行及前后各num行:
以下以-A选项为例:
grep需要和正则表达是才能发挥出威力,例如下面:
例一:显示/etc/passwd文件中以/bin/bash结尾的行;
例二:显示netstat -tan命令的结果中以LISTEN后跟0、1或多个空白字符结尾的行
例三:显示/etc/grub2.cfg文件中,以至少一个空白字符开头,且为数字结尾的行。
grep的用法就说这么多,基于正则表式还能组合出更多的用法,就大家研究去喽,下面该说说sed了。
三剑客之sed。
sed是一个行编辑器,通常sed编辑文件都不是直接编辑原文件的,而是将原文件复制一份在内存中进行编辑,在sed启动后内存空间中有一段空间pattern space和hold space,pattern space对复制来的文件进行逐行匹配,能被匹配到的我们就可以做指定编辑,sed可以对符合条件的行逐行编辑操作,也可以只对符合条件的部分进行编辑操作,处理完之后结果可以传送到stdout(标准输出),当然也可以选择删除,还可以选择存放到hold space中,不能匹配到的可以选择是否传送到标准输出。
关于sed用法:
sed[OPTIONS] ...’script’ [input-file]...
script:地址定界编辑命令,即对哪些文本,做什么样操作,注意地址定界和编辑命令之间没有空格。
注意:不论是否被patternspace匹配到,默认情况下原文件都会被输出到标准输出。
为了测试我建立了这样一个文本。
常用选项:
-n:不输出模式空间中的内容至屏幕;
-escript, --expression=script:多点编辑;
-f /PATH/TO/SED_SCRIPT_FILE
每行一个编辑命令,多个命令组成的文件叫做脚本文件
-r,--regexp-extended:支持使用扩展正则表达式;
-i[SUFFIX],--in-place[=SUFFIX]:直接编辑原文件 ;
表示删除test1文件行首为1或2位数字开头后面跟一个符号,并只显示删除后行中有cd字母的行。
地址定界:
(1) 空地址:对全文进行处理;
(2) 单地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址范围
#,#:
#,+#:
#,/pat1/
/pat1/,/pat2/
$:最后一行;
(4) 步进:~ 左边数字为其实行,右边数字为步长,即每次匹配加几行如:1~2表示所有的奇数行。
编辑命令:
d:删除匹配模式匹配到的行;
p:显示模式空间中的内容;
这里第五行被显示了两遍,因为默认情况下pattern space空间中的内容也是会被输出的,-p之后又会被显示一遍,所以这里出现了两次第五行的内容。
a \text:在行后面追加文本“text”,支持使用\n实现多行追加;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;
c \text:把匹配到的行替换为此处指定的文本“text”;
w/PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
test2文件中存放的就是
=:为模式匹配到的行打印行号;
!:条件取反;
地址定界!编辑命令;
s///:查找替换,其分隔符可自行指定,常用的有[email protected]@@, s###等;
替换标记:
g:全局替换;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
有兴趣的可以自行研究研究。