grep 命令
文章目录
- grep 命令
- grep 命令概述
- grep 命令核心选项及示例
- 模式选择和解释选项
- 输出控制选项
- 查找文件选项
- 输出内容上下文控制选项
grep 命令
grep 命令概述
grep 是 Linux 系统中核心命令之一,核心功能是从文本文件或管道数据流中筛选匹配的行及数据,与 sed(擅长修改文本)、awk(擅长格式化输出)并称为 Linux 操作文本的 “三剑客”,其中 grep 主打过滤功能。
grep 命令核心选项及示例
根据功能可将选项分为模式选择与解释、输出控制、查找文件、输出内容上下文控制四大类,以下是常用选项的详细说明及实操示例(示例中words
为测试文本文件)。
模式选择和解释选项
此类选项用于定义匹配模式的规则,支持正则、多模式等需求:
选项 | 功能 | 示例 | |||
---|---|---|---|---|---|
-E | 支持扩展正则表达式,相当于 egrep 命令 | `[1aoma@she11 ~]s cat words | grep -E '(dog){3}'或 [1aoma@she11 ~] cat words | egrep ‘(dog)[3}’`,输出 “dogdogdog”“dogdogdogdog”、、 | |
-e | 使用多个 - e 选项匹配多个 PATTERNS | `[1aoma@she11 ~]s cat words | grep -e “cat” -e 'dog’或 [1aoma@she11 ~]s cat words | egrep 'cat | dog’`,输出含 “cat” 或 “dog” 的行(如 “cat”“category”“dog” 等)、、 |
-f | 从文件读取多个 PATTERNS | 先执行 [1aoma@she11~]s echo -e 'cat\ndog'>pattens_file 创建模式文件,再执行 `[1aoma@she11~] s cat words | grep -f pattens_file`,输出含 “cat” 或 “dog” 的行、、、 | ||
-i | 忽略大小写匹配 | `[1aoma@she11 ~]s cat words | grep -i ‘cBt’`,输出 “cbt”、、 | ||
-W | 匹配整个单词 | `[1aoma@she11 ~]s cat words | grep -w 'cat’或 [1aoma@she11 ~]s cat words | grep ‘\bcat\b’`,输出 “cat”“hello cat”、、 | |
-X | 匹配整行 | `[1aoma@she11 ~]s cat words | grep -x 'cat’或 [1 |
[root@client ~ 11:19:05]# echo dogdogdogdog >>word
[root@client ~ 11:20:03]# echo dogdogdog >>word
[root@client ~ 11:20:12]# cat word | grep -E '(dog){3}'
dogdogdogdog
dogdogdog
[root@client ~ 11:20:13]# cat word | egrep '(dog){3}'
dogdogdogdog
dogdogdog
[root@client ~ 11:20:27]# cat word | grep -e 'cat' -e 'dog'
cat
category
acat
concatenate
dog
hello cat
dog
dogdogdogdog
dogdogdog
[root@client ~ 11:20:44]# echo -e 'cat\ndog' > newword
[root@client ~ 11:21:16]# cat newword
cat
dog
[root@client ~ 11:21:25]# cat word | grep -f newword
cat
category
acat
concatenate
dog
hello cat
dog
dogdogdogdog
dogdogdog
[root@client ~ 11:21:38]# cat word | grep -i 'cBt'
cbt
[root@client ~ 11:22:43]# cat word | grep -w 'cat'
cat
hello cat
[root@client ~ 11:22:59]# cat word | grep '\bcat\b'
cat
hello cat
[root@client ~ 11:23:13]# cat word | grep -x 'cat'
cat
[root@client ~ 11:23:27]# cat word | grep '^cat$'
cat
输出控制选项
此类选项用于控制匹配结果的输出形式:
选项 | 功能 | 示例 | |||
---|---|---|---|---|---|
-v | 反向匹配,显示与 PATTERNS 不匹配的项目 | `[1aoma@she11~]s cat words | egrep -v "^d | ^c",输出“acat”“hello cat”;也可用于忽略注释行和空白行,如 [1aoma@she11~]s egrep -v "^# | ^$" /etc/profile`、、 |
-m | 控制最大匹配数目,匹配特定次数后停止匹配 | `[1aoma@she11~]s cat words | grep -m2 ‘dog’`,输出前 2 个含 “dog” 的行(“dog”“dogdog”)、、 | ||
-C | 显示匹配到项目的数量 | `[1aoma@she11 ~]s cat words | grep -c ‘dog’`,输出 “4”(假设文件中含 4 个匹配行)、、 | ||
-b | 显示匹配项目的字节偏移量 | `[1aoma@she11~]s cat words | grep -b ‘cat’`,输出 “0:cat”“4:category”“13:acat” 等、、 | ||
-n | 显示匹配项目的行号 | `[1aoma@she11 ~]s cat words | grep -n ‘cat’`,输出 “1:cat”“2:category”“3:acat” 等、、 | ||
-o | 只显示匹配到的内容,行中其他内容不显示 | `[1aoma@she11 ~]s cat words | egrep -o ‘(dog){3}’`,输出 “dogdogdog”“dogdogdog”、、 | ||
-q | 不显示任何正常输出,用于脚本判定文件是否含特定内容,通过$? 查看匹配结果 | 找到匹配时:`[1aoma@she11 ~] s cat words | egrep -q '(dog){3}'后执行 [1aoma@she11~]$echo $?`,输出 “0”;未找到时输出 “1”、、、 | ||
-S | 不显示任何错误输出 | [1aoma@she11~]s grep -s '^SELINUX=' /etc/shadow /etc/selinux/config ,仅输出/etc/selinux/config:SELINUX=disabled ,不显示权限错误、、 |
[root@client ~ 11:23:46]# cat word | egrep -v '^d|^c'
acathello cat
[root@client ~ 11:42:29]# cat word | grep 'dog'
dog
dog
dogdogdogdog
dogdogdog
[root@client ~ 11:42:56]# cat word | grep -m2 'dog'
dog
dog
[root@client ~ 11:43:02]# cat word | grep -m3 'dog'
dog
dog
dogdogdogdog
[root@client ~ 11:43:06]# cat word | grep -c 'dog'
4
[root@client ~ 11:43:17]# cat word | grep -b 'cat'
0:cat
4:category
13:acat
18:concatenate
70:hello cat
[root@client ~ 11:43:41]# cat word | grep -n 'cat'
1:cat
2:category
3:acat
4:concatenate
15:hello cat
[root@client ~ 11:43:48]# cat word | egrep -o '(dog){3}'
dogdogdog
dogdogdog
[root@client ~ 11:44:14]# cat word | egrep '(dog){3}'
dogdogdogdog
dogdogdog
[root@client ~ 11:44:45]# cat word | egrep -q '(dog){3}'
[root@client ~ 11:45:20]# echo $?
0
[root@client ~ 11:45:27]# cat word | egrep -q '(dog){3}acsafsa'
[root@client ~ 11:45:35]# echo $?
1
查找文件选项
此类选项用于递归查找目录中的文件,或控制文件筛选规则。
选项 | 全称 / 功能说明 | 示例 | |
---|---|---|---|
-r | --recursive ,递归查找目录中的所有文件(不跟随软链接) | 递归查找/etc 目录中含 “SELINUX=” 的文件:grep -r '^SELINUX=' -S /etc 输出:/etc/selinux/config:SELINUX=disabled | |
-R | --dereference-recursive ,递归查找并跟随软链接 | 用法与-r 一致,仅多了 “跟随软链接”:grep -R '^SELINUX=' -S /etc | |
-h | --no-filename ,不显示匹配内容所在的文件名 | 递归查找时仅显示匹配内容:grep -r '^SELINUX=' -S -h /etc 输出:SELINUX=disabled (无路径) | |
-H | --with-filename ,显示匹配内容所在的文件名(默认) | 递归查找时显示路径:grep -r '^SELINUX=' -S -H /etc 输出:/etc/selinux/config:SELINUX=disabled | |
-l | --files-with-matches ,仅显示包含匹配内容的文件名 | 显示/etc 中含 “SELINUX=” 的文件:grep -r '^SELINUX=' -S -l /etc 输出:/etc/selinux/config | |
-L | --files-without-match ,仅显示不包含匹配内容的文件名 | 显示/etc 中不含 “SELINUX=” 的最后 5 个文件:`grep -r ‘^SELINUX=’ -S -L /etc | tail -5 <br>输出:如 /etc/gdm/custom.conf、 /etc/nfs.conf` 等 |
--include=GLOB | 仅查找符合 GLOB 模式的文件(如.conf 后缀) | 递归查找/etc 中.conf 文件里的 “SELINUX=”:grep -r '^SELINUX=' -S --include='*.conf' /etc | |
--exclude=GLOB | 跳过符合 GLOB 模式的文件 | 递归查找时跳过.log 文件:grep -r 'pattern' -S --exclude='*.log' /etc |
输出内容上下文控制选项
此类选项用于显示匹配行的前后上下文(如前 N 行、后 N 行),便于查看匹配内容的周边信息。
选项 | 全称 / 功能说明 | 示例 | ||
---|---|---|---|---|
-B | --before-context=NUM ,显示匹配行及前 NUM 行 | 查找 IP“10.1.8.88” 并显示前 2 行:`ip addr | grep ‘10.1.8.88’ -B2`输出:匹配行的前 2 行 + 匹配行 | |
-A | --after-context=NUM ,显示匹配行及后 NUM 行 | 查找 “ens32:” 并显示后 2 行:`ip addr | grep ‘ens32:’ -A2`输出:匹配行 + 匹配行的后 2 行 | |
-C | --context=NUM ,显示匹配行及前后各 NUM 行(等效于-NUM ) | 查找 “10.1.8.88” 并显示前后各 2 行:`ip addr | grep ‘10.1.8.88’ -C2<br>或 ip addr | grep ‘10.1.8.88’ -2`输出:匹配行的前 2 行 + 匹配行 + 匹配行的后 2 行 |
--color[=WHEN] | 高亮显示匹配内容(WHEN:always 强制高亮、never 不高亮、auto 自动) | 高亮匹配 “cat” 的内容:`cat words | grep --color=auto ‘cat’`输出 |