我们经常会遇到从一个文件中查找某些信息或从一个日志文件中查找信息的处理文本文件的需求,本文介绍一下linux中处理文本工具的三剑客之中的grep和sed,在介绍之前,先介绍一下正则表达式:
正则表达式由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能
其中,基本正则表达式的元字符可以分为以下几种:
匹配字符:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模;
*:匹配前面的字符任意次;0次、1次或多次
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的
\+:匹配其前面的字符一次或多次,即其前面的字符至少出现一次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,\}:至少m次
位置锚定:
^:行首锚定;用于模式的最左侧
$:行尾锚定;用于模式的最右侧
^PATTERN$:用于PATTERN来匹配整行
^$:空白行
^[[:space:]]*$:空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\<或\b:词首锚定,用于单词模式的左侧;
\>或\b:词尾锚定,用于单词模式的右侧;
\<PATTERN\>:匹配完整单词
grep命令:
作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文件逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE][FILE...]
常用选项:
--color=auto:对匹配到的文本着色后高亮显示;
比如:查找/woniu/testz.txt文件中包含有his的那一行,并对匹配到的文本着色后高亮显示;
-i:ignorcase,忽略字符的大小写;
比如:查找/woniu/testz.txt文件中包含有he或He的那一行;
-o:只显示匹配到的字符串本身
比如:查找/woniu/testz.txt文件中包含有he的那一行;
-v:显示不能被模式匹配到的行
比如:查找/woniu/testz.txt文件中不包含有he的那一行;
-E:支持使用扩展的正则表达式元字符
-q:静默模式,即不输出任何信息
-A #(after):显示匹配到的字符串行的后#行
比如:显示/woniu/testz.txt文件中包含有He的那一行的后一行;
-B #(before):显示匹配到的字符串行的前#行
比如:显示/woniu/testz.txt文件中包含有He的那一行的前一行;
-C (context)#:显示匹配到的字符串行的前后各#行
比如:显示/woniu/testz.txt文件中包含有He的那一行的前一行和后一行;
sed:流编辑器,可以将匹配到的数据进行替换、删除、新增、选取特定行等功能。
sed用法:ed[OPTION]... 'script' [input-file]...
常用选项:
-n:不输出模式空间中的内容至屏幕
-e script,--expression=script:多点编辑;
-f /PATH/TO/SED_SCRIPT_FILE
-r:支持使用扩展正则表达式
-i:直接编辑原文件
地址定界:
(1)不给地址(空地址):对全文进行处理;
(2)单地址:
#:指定行
例如,打印test.txt中的第一行;
/pattern/:被此模式匹配到的每一行
例如,打印test.txt中包含his的行
(3)地址范围
#,#
例如,打印test.txt中的第一行到第三行的内容;
#,+#
例如,打印test.txt中的第一行及第一行之后两行的内容;
#,/pat1/
/pat1/,/pat2/
(4)步进:~
1~2:所有奇数行
2~2:所有偶数行
编辑命令:
d:删除模式空间中的内容
例如,删除test.txt文件中的前两行:
p:打印模式空间中的内容
sed '1~2p'/etc/fstab此用法会显示两次文件中的奇数行,因为默认情况下匹配到的模式会被输出,而p又表示输出,所以会显示两次,如果想显示一次,使用-n;
a \text:在行后面插入文本"text",支持使用\n(\n表换行)多行插入;
例如,在第一行后面插入zyc:
i \text:在行前面插入文本"text",支持使用\n(\n表换行)多行插入;
例如,在第一行前面插入两行zyc:
c \text:把匹配到的行替换为此处指定的文本“text”;
例如,将第一行替换为zyc
w /PATH/TO/SOMEFILE :保存模式空间匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
例如,显示test.txt中包含his行的行号:
!:条件取反;放在模式后面的命令之前
例如,显示test.txt文件中,不包含his的行:
s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等;
替换标记:
g:全局替换;
w/PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
例如,将test.txt文件中his替换为he:
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;原行会被覆盖
N:追加读取匹配到的行的下一行至模式空间中
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
示例:
sed -n 'n;p' FILE:显示偶数行;
sed '1!G;h;$!d' FILE:逆序显示文件的内容;
sed '$!d' FILE:取出最后一行
sed'$!N;$!D' FILE:取出文件后两行
sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE:显示奇数行;
sed 'G' FILE:在原有的行后面添加一行空白行;