grep
过滤来自一个文件或标准输入匹配模式内容。
除了 grep 外,还有 egrep、fgrep。egrep 是 grep 的扩展,相当于 grep -E。fgrep 相当于 grep - f,用的少。
返回状态
| 找到匹配的表达式 | 返回的退出状态为0 |
|---|---|
| 没找到匹配的表达式 | 返回的退出状态为1 |
| 找不到指定文件 | 返回的退出状态为2 |
支持的正则参数
| 支持的正则 | 描述 |
|---|---|
| -E,—extended-regexp | 模式是扩展正则表达式(ERE) |
| -P,—perl-regexp | 模式是 Perl 正则表达式 |
| -e,—regexp=PATTERN | 使用模式匹配,可指定多个模式匹配 |
| -f,—file=FILE | 从文件每一行获取匹配模式 |
| -i,—ignore-case | 忽略大小写 |
| -l,—files-with-matches | 只匹配列出行所在的文件名 |
| -w,—word-regexp | 模式匹配整个单词(精确匹配) |
| -x,—line-regexp | 模式匹配整行,精确匹配 |
| -v,—invert-match | 打印不匹配的行(取反) |
输出控制参数
| 输出控制 | 描述 |
|---|---|
| -c,—count | 只打印每个文件匹配的行数 |
| -h,—no-filename | 不输出文件名 |
| -H,—with-filename | 打印每个匹配的文件名 |
| -m,—max-count=NUM | 输出匹配的结果 num 数 |
| -n,—line-number | 打印行号 |
| -o,—only-matching | 只打印匹配的内容 |
| -q,—quiet | 不输出正常信息 |
| -r,—recursive | 递归目录 |
| -s, —no-messages | 不输出错误信息 |
| —include=FILE_PATTERN | 只检索匹配的文件 |
| —exclude=FILE_PATTERN | 跳过匹配的文件 |
| —exclude-from=FILE | 跳过匹配的文件,来自文件模式 |
| —exclude-dir=PATTERN | 跳过匹配的目录 |
内容行控制参数
| 内容行控制 | 描述 |
|---|---|
| -A,—after-context=NUM | 打印匹配的后几行 |
| -B,—before-context=NUM | 打印匹配的前几行 |
| -C,—context=NUM | 打印匹配的前后几行 |
| —color[=WHEN], | 匹配的字体颜色 |
grep需要注意:
- ps|grep 容易把自己也过滤出来,写脚本时需要注意,看是使用-v还是修改判断条件
ps -ef | grep sshd | grep -v grepps -ef | grep -c [c]rond
示例:
1.输出b文件在a文件中相同的行
grep -f a b #-f 从文件每一行获取匹配模式
2.输出b文件在a文件不同的行
grep -v -f a b #-v 取反
3.匹配多个模式,同时匹配a和bc标签
echo "a bc de" | xargs -n1 | grep -e 'a' -e 'bc'
4.去除空格httpd.conf文件空行或开头#号的行
grep -E -v "^$|^#" /etc/httpd/conf/httpd.conf
5.匹配开头部分大小写的单词
echo "A cv v fe w" | xargs -n1 | grep -i a #-i 忽略大小写echo "A cv v fe w" | xargs -n1 | grep "[Aa]"
6.只显示匹配的字符串
echo "this is a test" | grep -o 'is' #-o 只打印匹配的内容
7.输出匹配的前五个结果
seq 1 20 | grep -m 5 -E '[0-9]{2}' #-m 输出匹配的结果 -E 正则
8.统计匹配了多少行
seq 1 20 | grep -c -E '[0-9]{2}' #-c 统计出现的数量
9.匹配b字符开头的行
echo "a bc de" | xargs -n1 | grep '^b'
10.匹配de字符结尾的行并输出匹配的行
echo "a dfa fdcde deaqde defgtde ade de" | xargs -n1 | grep -n 'de$'#-n 显示行号
11.递归搜索/etc/目录下包含ip的conf后缀的文件
grep -r '192.168.0.157' /etc --include *.conf #-r 递归查询#--include 只检索匹配的文件
12.排除搜索bak后缀的文件
grep -r '192.168.0.157' /etc --exclude *.bak #跳过匹配的文件
13.排除来自file中的文件
grep -r '192.168.0.157' /opt --exclude-from file #跳过匹配的文件,来自文件模式
14.匹配41或42的数字
seq 41 45 | grep -E 4[12]
15.匹配至少2个字符
seq 13 | grep -E '[0-9]{2}'
16.匹配至少2个字符的单词,最多3个字符的单词
echo "a fsda awd da gfd fd wqeqew d wqadsa" |xargs -n1 | grep -E -w -o '[a-z]{2,3}' #正则 整个单词 匹配的内容
17.匹配所有ip
ifconfig |grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
18.打印匹配结果及后3行
seq 1 10 |grep 5 -A 3 #从字符5开始的后面三行
19.打印匹配结果及前3行
seq 1 10 | grep 5 -B 3 #从字符5开始的前面三行
20.打印匹配结果及前后 3 行
seq 1 10 |grep 5 -C 3
21.不显示输出
不显示错误输出:grep 'a' abcgrep: abc: No such file or directorygrep -s 'a' abc #-s 不显示错误信息echo $?2不显示正常输出:grep -q 'a' a.txt #-q 不显示正常信息
22.系统报警,日志太大,查询含有特定文本的文件
grep -n "2022-1-12" *.log #-n 打印行号
23.从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:
find / -type f -name "*.log" | xargs grep "ERROR"
24.匹配不是#开头的行-v 取反^# 以#开头
grep -v "^#" /etc/ssh/sshd_config
25.列出匹配行的文件名
egrep 'root' /etc/passwd /etc/shadow /etc/hosts/etc/passwd:root:x:0:0:root:/root:/bin/bash/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin/etc/shadow:root:$6$WpDVjk9SP3Z5oA.q$LlU943UIOsjStA1sIVlDjJZMf/6ulzN2KcSmlli5o1gnkFfeP8cifa2GRtrSz7wNPF2MMYI6a6umUqwG6opCc.::0:99999:7:::
26.在每行之前加上该行在文件中的相对行号-n显示行号s
egrep -n 'root' /etc/passwd /etc/shadow /etc/hosts/etc/passwd:1:root:x:0:0:root:/root:/bin/bash/etc/passwd:10:operator:x:11:0:operator:/root:/sbin/nologin/etc/shadow:1:root:$6$WpDVjk9SP3Z5oA.q$LlU943UIOsjStA1sIVlDjJZMf/6ulzN2KcSmlli5o1gnkFfeP8cifa2GRtrSz7wNPF2MMYI6a6umUqwG6opCc.::0:99999:7:::
27.匹配IP地址
echo 123.232.23.2 1.2.33.4 65.53.333.4 12.2.2 1.2323.33 | egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'
28.首行为某个单词包括下划线后面跟一个小括号的行-E 支持扩展正则-o 只显示匹配到的内容
cat /etc/rc.d/init.d/functions | grep -Eo "^[a-Z]*_*.*\(\)"以a-Z开头重复多次,或者_重复多次 中间是任意字符 末尾是()
29.列出/etc目录下所有以.conf结尾的文件名,并将其大小写转换为大写。-E 支持扩展正则-o 只显示匹配到的内容
find /etc -name '*.conf' | grep -Eo "[^/]*(\.conf)$" | tr "a-z" "A-Z"匹配除了 / 外的所有字符出现多次,并且以.conf结尾
30.显示/etc/meminfo文件中以大小s开头的行
cat /proc/meminfo | grep '^[sS]'
31.显示/etc/passwd文件中不以/bin/bash结尾的行
cat /etc/passwd | grep -v "/bin/bash$"
32.显示centos7上所有系统用户的用户名和UID
cat /etc/passwd | cut -d":" -f 1,3 | grep -v "root" | grep -v "[0-9]\{4,\}"
33.取出文件/etc/inittab文件中,以#开头,且后面跟一个空格的行
grep "^#[[:space:]]" /etc/inittab
