grep: Global search regular expression and print out the line.
作用: 文本搜索工具, 根据用户指定的 "模式 (过滤条件)" 对目标文件逐行进行匹配检查, 打印匹配的行
模式: 由正则表达式的元字符及文本字符所编写出的过滤条件
- grep [OPTIONS] PATTERN [FILE...]
- OPTIONS:
--color=auto: 对匹配到的文本着色后高亮显示
-i, --ignore-case: 忽略字符的大小写
-o, --only-matching: 仅显示匹配到的字符串本身
-v, --invert-match: 显示不能被模式匹配到的行
-E, --extended-regexp: 支持使用扩展的正则表达式元字符
-q, --quiet, --silent: 静默模式, 即不输出任何信息
- -A #:after, 显示匹配到行和向后 #行
- -B #:before, 显示匹配到行和前 #行
- -C #:context, 显示匹配到行和前后各 #行
正则表达式分为两种: 1. 基本正则表达式 2. 扩展正则表达式
PATTERN, 正则表达式 (这里用到是基本正则表达式)
基本正则表达式有四种匹配模式: 1. 字符匹配 2. 匹配次数 3. 位置锚定 4. 分组及应用
1. 字符匹配:
.(英文的点): 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[^]: 匹配指定范围外的任意单个字符
特殊:[:digit:],[:lower:],[:upper:],[:alpha:],[:alnum:],[:punct:],[:space:]
2. 匹配次数:
*: 匹配其前面的字符任意次 (0,1, 多次)
.*: 匹配任意长度的任意字符
\?: 匹配其前面的字符 0 次或 1 次, 即其前面的字符是可有可无的
\+: 匹配其前面的字符 1 次或多次, 即其面的字符要出现至少 1 次
\{#\}: 匹配其前面的字符 #次
\{m,n\}: 匹配其前面的字符至少 m 次, 至多 n 次
\{0,n\}: 至多 n 次
\{m,\}: 至少 m 次
3. 位置锚定
^: 行首锚定, 用于模式的最左侧
$: 行尾锚定, 用户模式的最右侧
^PATTERN$: 用于 parrern 来匹配整行
^$: 空白行
^[[:space:]]*$: 空行或包含空白字符的行
\< 或 \ b: 词首锚定, 用于单词模式的左侧
\> 或 \ b: 词尾锚定, 用于单词模式的右侧
\<PARRERN\>: 匹配完整单词
4. 分组及应用:
\(\): 将一个或多个字符捆绑在一起, 当做一个整体进行处理
note: 分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中
\1: 模式从左侧起, 第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2: 模式从左侧起, 第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
例题:
1. 显示 / etc/passwd 文件中不以 / bin/bash 结尾的行
grep -v "/bin/bash$" /etc/passwd
2. 找出 / etc/passwd 文件中两位数或三位数
grep '[1-9]\{1,2\}[1-9]' /etc/passwd
3. 找出 / etc/rc.d/rc.sysinit 或 / etc/grub2.cfg 文件中, 以至少一个空白字符开头, 且后面非空白字符的行
grep '^[[:space:]]\+[[:alpha:]]' test.txt
4. 找出 "netstat -tan" 命令的结果中以'LISTEN'后跟 0,1 或多个空白字符结尾行
netstat -tan | grep 'LISTEN[[:space:]].*$'
5. 创建 test.txt 文件内容如下:
- He love his lover
- He likes his lover
- She likes her liker
- She loves her liker
查找单词中出现 l 和 e 之间存在两个字符, 且一行中要出现两次查找到的内容.
grep '\(l..e\).*\1' test.txt
egrep 命令: 支持扩展的正则表达式实现类似于 grep 文本过滤功能
- egrep [OPTIONS] PATTERN [FILE...]
- OPTIONS
- -l, -o, -v, -q, -A, -B, -C(跟上述的 grep 功能一样, 这里就不再累述)
-G: 支持基本正则表达式
PATTERN, 正则表达式 (这里的正则表达式用到是扩展表达式)
扩展正则表达式也有四种匹配模式: 1. 字符匹配 2. 匹配次数 3. 位置锚定 4. 分组及应用
字符匹配和位置锚定跟 grep 用法一样这里不再累述
次数匹配: 用法还是跟上述一样. 但是扩展正则表达式?,+,{,} 不需要用 \ 来转义
分组及引用: 用法还是跟上述一样. 但是扩展正则表达式括号不需要用 \ 来转义. 还有新的一个功能 或 (|) . 例如 (c|C)at:cat 或者 Cat
例题:
1. 找出 / proc/meminfo 文件中, 所有在大写或小写 S 开头的行, 至少有两种实现方式
- egrep "^(S|s)" /proc/meminfo
- egrep ^[Ss] /proc/meminfo
2. 显示当前系统上 root,Python,maintain 用户的相关信息
egrep ^\(root\|python\|maintain\) /etc/passwd
3. 找出 / etc/rc.d/init.d/functions 文件中某单词后面跟一个小括号的行
- grep "[[:alpha:]]\+(" /etc/rc.d/init.d/functions
- egrep '[[:alpha:]]\+|\)|\(' /etc/rc.d/init.d/functions
4. 使用 echo 命令输出一绝对路径, 使用 egrep 取出几名
echo /home/maintain/test.txt | grep -E -o "[^/]+/?$"
5. 进一步: 取出其路径名; 类似于对执行 dirname 命令结果
找出 ifconfig 命令结果中的 1-255 之间的数值
ifconfig eth0 | egrep -o "[1-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"
6. 添加用户 bash,testbash,basher 以及 nologin(其中 shell 为 / sbin/nologin), 而后找出 / etc/passwd 文件中用户名同 shell 名行
egrep "(^[[:alnum:]]+\>).*\1$" /etc/passwd
扩展题: 找出 ifconfig 命令结果中的 IP 地址
ifconfig eth0 | grep "inet" | sed 's/[[:space:]]\+inet //' | sed "s/ .*//"
fgrep 命令: 不支持正则表达式元字符
当无需要用到元字符去编写模式时, 使用 fgrep 必能更好
来源: http://www.bubuko.com/infodetail-3102092.html