grep 文本过滤工具
grep (Global search REgular expression and Print out the line)
文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
--color=auto 高亮显示
-i:忽略大小写
-o:只显示匹配到的行
-w:匹配整个单词(数字字母下划线算单词一部分)
-v:只显示不被模式匹配到的行
-n:显示行号
-c:统计匹配到的行数
-e:多个选项之间是逻辑或or关系
-q:静默模式,不显示任何信息
-A #:After,前#行
-B #:Before,后#行
-C #:Context,前后#行
-E:使用扩展正则表达式Egrep
-F:使用Fgrep
正则表达式REGEXP
由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配功能
分类:
基本正则表达式:BRE
扩展正则表达式:ERE
元字符分类 man 7 regex
字符匹配 次数匹配 位置锚定 分组
基本正则表达式元字符
字符匹配
.:匹配任意字符
.*:任意字符任意次
[ ]:匹配指定范围内的字符
[^]:匹配指定范围外的字符
[[:digit:]]:数字
[[:lower:]]:小写字母
[[:upper:]]:大写字母
[[:alpha:]]:字符
[[:alnum:]]:字符和数字
[[:space:]]:水平和垂直的空白字符
[[:blank:]]:水平空白字符
[[:punct:]]:标点符号
匹配次数
*:匹配其前面字符任意次,包括0次
贪婪模式:尽可能长的匹配
\+:匹配其前面字符至少1次
\?: 匹配其前面字符0或1次
\{m,n\}:匹配其前面字符至少m次至多n次
\{n\}:匹配其前面字符n次
\{n,\}:匹配其前面字符至少n次
\{,n\}:匹配其前面字符至多n次
位置锚定
^:行首锚定,用于模式最左侧
$:行尾锚定,用于模式最右侧
^PATTERN$ 匹配整行
^$空行 ^[[:space:]]*$ 空白行
\<或\b:词首锚定
\>或\b:词尾锚定
\<PATTERN\> 匹配整个单词
分组
\(\)将一个或多个字符捆绑到一起,当作一个整体进行处理 \(liu\)\+
分组括号中模式匹配到的内容会被正则表达式引擎记录到内部变量中,这些变量的命名方式是\1,\2,\3...
\1表示从左侧起第一个左括号与之右括号之间模式所匹配到的字符
\(string1\+\(string2\)*\)
\1:string1\+\(string2\)*
\2:string2
后向引用:引用前面分组括号中模式所匹配到的字符,而非模式本身
或者:\|
a\|b a或b C\|cat C或cat \(C\|c\)at Cat或cat
egrep及扩展正则表达式
egrep [OPTIONS] PATTERN [FILE...]
扩展正则表达式元字符
字符匹配
.:任意单个字符
[ ]:指定范围内
[^]:指定范围外
次数匹配
*:匹配其前面字符任意次
+:至少1次
?:0或1次
{m}:匹配m次
{m,n}:至少m次,至多n次
位置锚定
^:行首
$:行尾
\<或\b:词首
\>或\b:词尾
分组
( ) 后向引用:\1,\2,\3,...
或者
a|b:a或b c|Cat:c或Cat (C|c)at:Cat或cat
grep正则表达式经典练习题
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
2、显示/etc/passwd文件中不以/bin/bash结尾的行
3、显示用户rpc默认的shell程序
4、找出/etc/passwd中的两位或三位数
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
7、显示CentOS7上所有系统用户的用户名和UID
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
10、取出当前OS主版本号
sed Stream EDitor 行编辑器
工作机制:sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使用诸如“D”的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。
功能:实现便捷的查看及修改文件
语法:
sed [OPTION]... 'script' inputfile...
常用选项
-n:不输出模式空间内容到屏幕
-e:多点编辑
-f /path/to/script_file:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i.bak:备份文件并原处编辑
script '地址命令'
地址定界
(1)不给地址:对全文进行处理
(2)单地址:
#:指定的行,$:最后的行
/pattern/:被此处模式匹配到的行
(3)地址范围:
#,#
#,+# 10,+20 --> 10,30
/pat1/,/pat2/ #,/pat1/
(4)~:步进
1~2 奇数行
2~2 偶数行
编辑命令
d:删除模式空间匹配到的行
p:打印当前模式空间内容,追加到默认输出之后
a[\]text:在指定行后面追加文本
\n可追加多行
i[\]text:在行前面插入文本
c[\]text:替换为单行或多行文本
w /path/somefile:
r /path/somefile:
=:显示模式匹配到的行号
!:模式匹配空间中匹配到的行取反
查找替换
s///,支持使用其它分隔符 如s@@@ s###等
替换标记:
g:行内全局替换
p:显示替换成功的行
w /path/to/somefile:将替换成功的行保存至文件
sed高级用法
*大写字母都是追加,小写字母都是覆盖
P:打印模式空间开端至\n内容,并追加至默认输出之前
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:保持空间覆盖至模式空间
G:保持空间追加至模式空间
x:模式空间中的内容与保持空间中的内容互换
n:读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d:删除模式空间中的行
D:删除模式空间多行中的首行
示例
我们以test.txt文件为例,test.txt为文本文件(seq 1 8 > test.txt)
sed -n 'n;p' test.txt 显示偶数行
sed 'n;d' test.txt 显示奇数行
显示最后一行
sed '$!N;$!d' test.txt
sed '$!d' test.txt
sed 'N;D' test.txt
sed '1!G;h;$!d' test.txt 倒序显示
每行下面插入空行
sed 'G' test.txt
sed '/^$/;G' test.txt
sed 'g' test.txt 显示空行
sed '$!N;$!D' 显示倒数二行
awk