纸上得来终觉浅,绝知此事要躬行。
1. grep 命令
介绍 grep 命令的基本语法格式和参数列表!
文本搜索工具,根据用户指定的”模式”对目标文本逐行进行匹配检查,打印匹配到的行。
- 模式:由正则表达式字符及文本字符所编写的过滤条件;
- REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;
正则表达式:
- 基本正则表达式:BRE
- 扩展正则表达式:ERE
格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
参数选项:
--color=auto
- 对匹配到的文本着色显示
-v
- 显示不能够被 pattern 匹配到的行
-i
- 忽略字符大小写
-o
- 仅显示匹配到的字符串
-q
- 静默模式,不输出任何信息
-A #
- after, 后#行
-B #
- before, 前#行
-C #
- context, 前后各#行
-E
- 使用 ERE 表达式
2. 基本正则表达式
介绍常见 BRE 的匹配类型和使用方式!
2.1 字符匹配
.
- 匹配任意单个字符;
*
- 匹配前面的字符任意次
[]
- 匹配指定范围内的任意单个字符
[^]
- 匹配指定范围外的任意单个字符
[:digit:]
、[:lower:]
、[:upper:]
、[:alpha:]
、[:alnum:]
、[:punct:]
、[:space:]
2.2 贪婪模式
.*
- 任意长度的任意字符
\?
- 匹配其前面的字符 0 或 1 次;即前面的可有可无
\+
- 匹配其前面的字符至少 1 次
\{m\}
- 匹配前面的字符 m 次
\{m,n\}
- 匹配前面的字符至少 m 次,至多 n 次
\{0,n\}
- 匹配前面的字符至多 n 次
\{m,\}
- 匹配前面的字符至少 m 次
2.3 位置锚定
^
- 行首锚定;用于模式的最左侧
$
- 行尾锚定;用于模式的最右侧
^PATTERN$
- 用于模式匹配整行
^$
- 空行
^[[:space:]]*$
- 匹配空格
\<
或\b
- 首锚定,用于单词模式的左侧
\>
或\b
- 词尾锚定,用于单词模式的右侧
\<PATTERN\>
- 匹配整个单词
2.4 分组
\(\)
- 将一个或多个字符捆绑在一起,当作一个整体进行处理
在\(ab\+\(xy\)*\)
中,\1
代表ab\+\(xy\)*
,\2
代表xy
Note:
1、分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中
2、这些变量的命名方式为: \1, \2, \3, …
3、\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
4、后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)
2.5 实战演示
# 1、如果用户root存在,显示其默认的shell程序
$ id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
# 2、找出/etc/passwd中的两位或三位数
$ grep "\<[0-9]\{2,3\}\>" /etc/passwd
# 3、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行
$ grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
# 4、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
$ netstat -tan | grep "LISTEN[[:space:]]*$"
# 使用grep查找时不匹配grep命令本身
$ ps -ef | grep [n]ginx
# cat /proc/[pid]/stat
# https://www.kawabangga.com/posts/4186#comment-29292
$ pkill host-networking
$ pkill -f host-networking
# 查找进程号
$ systemctl show --property MainPID --value nginx.service
$ pidof nginx
3. 扩展的正则表达式
介绍常见 ERE 的匹配类型和使用方式!
3.1 字符匹配
.
[]
[^]
3.2 次数匹配
*
?
+
{m}
{m,n}
3.3 锚定
^
$
\<
,\b
\>
,\b
3.4 分组
()
- 后向引用:
\1, \2, ...
- 或者使用
a | b
- C | cat
- 后向引用:
3.5 实战演示
# 1、显示当前系统root、centos或user1用户的默认shell和UID;
$ grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
# 2、找出/etc/rc.d/init.d/functions文件(centos6)中某单词后面跟一个小括号的行;
$ grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions
# 、使用echo输出一绝对路径,使用egrep取出其基名;
$ echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
4. egrep and fgrep
- egrep 命令
egrep = grep -E
- fgrep 命令
fgrep
:不支持正则表达式搜索,能够很快的进行搜索