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 grep
    ps -ef | grep -c [c]rond

示例:

1.输出b文件在a文件中相同的行

  1. grep -f a b #-f 从文件每一行获取匹配模式

2.输出b文件在a文件不同的行

  1. grep -v -f a b #-v 取反

3.匹配多个模式,同时匹配a和bc标签

  1. echo "a bc de" | xargs -n1 | grep -e 'a' -e 'bc'

4.去除空格httpd.conf文件空行或开头#号的行

  1. grep -E -v "^$|^#" /etc/httpd/conf/httpd.conf

5.匹配开头部分大小写的单词

  1. echo "A cv v fe w" | xargs -n1 | grep -i a #-i 忽略大小写
  2. echo "A cv v fe w" | xargs -n1 | grep "[Aa]"

6.只显示匹配的字符串

  1. echo "this is a test" | grep -o 'is' #-o 只打印匹配的内容

7.输出匹配的前五个结果

  1. seq 1 20 | grep -m 5 -E '[0-9]{2}' #-m 输出匹配的结果 -E 正则

8.统计匹配了多少行

  1. seq 1 20 | grep -c -E '[0-9]{2}' #-c 统计出现的数量

9.匹配b字符开头的行

  1. echo "a bc de" | xargs -n1 | grep '^b'

10.匹配de字符结尾的行并输出匹配的行

  1. echo "a dfa fdcde deaqde defgtde ade de" | xargs -n1 | grep -n 'de$'
  2. #-n 显示行号

11.递归搜索/etc/目录下包含ip的conf后缀的文件

  1. grep -r '192.168.0.157' /etc --include *.conf #-r 递归查询
  2. #--include 只检索匹配的文件

12.排除搜索bak后缀的文件

  1. grep -r '192.168.0.157' /etc --exclude *.bak #跳过匹配的文件

13.排除来自file中的文件

  1. grep -r '192.168.0.157' /opt --exclude-from file #跳过匹配的文件,来自文件模式

14.匹配41或42的数字

  1. seq 41 45 | grep -E 4[12]

15.匹配至少2个字符

  1. seq 13 | grep -E '[0-9]{2}'

16.匹配至少2个字符的单词,最多3个字符的单词

  1. echo "a fsda awd da gfd fd wqeqew d wqadsa" |xargs -n1 | grep -E -w -o '[a-z]{2,3}' #正则 整个单词 匹配的内容

17.匹配所有ip

  1. ifconfig |grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

18.打印匹配结果及后3行

  1. seq 1 10 |grep 5 -A 3 #从字符5开始的后面三行

19.打印匹配结果及前3行

  1. seq 1 10 | grep 5 -B 3 #从字符5开始的前面三行

20.打印匹配结果及前后 3 行

  1. seq 1 10 |grep 5 -C 3

21.不显示输出

  1. 不显示错误输出:
  2. grep 'a' abc
  3. grep: abc: No such file or directory
  4. grep -s 'a' abc #-s 不显示错误信息
  5. echo $?
  6. 2
  7. 不显示正常输出:
  8. grep -q 'a' a.txt #-q 不显示正常信息

22.系统报警,日志太大,查询含有特定文本的文件

  1. grep -n "2022-1-12" *.log #-n 打印行号

23.从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:

  1. find / -type f -name "*.log" | xargs grep "ERROR"

24.匹配不是#开头的行
-v 取反
^# 以#开头

  1. grep -v "^#" /etc/ssh/sshd_config

25.列出匹配行的文件名

  1. egrep 'root' /etc/passwd /etc/shadow /etc/hosts
  2. /etc/passwd:root:x:0:0:root:/root:/bin/bash
  3. /etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
  4. /etc/shadow:root:$6$WpDVjk9SP3Z5oA.q$LlU943UIOsjStA1sIVlDjJZMf/6ulzN2KcSmlli5o1gnkFfeP8cifa2GRtrSz7wNPF2MMYI6a6umUqwG6opCc.::0:99999:7:::

26.在每行之前加上该行在文件中的相对行号
-n显示行号s

  1. egrep -n 'root' /etc/passwd /etc/shadow /etc/hosts
  2. /etc/passwd:1:root:x:0:0:root:/root:/bin/bash
  3. /etc/passwd:10:operator:x:11:0:operator:/root:/sbin/nologin
  4. /etc/shadow:1:root:$6$WpDVjk9SP3Z5oA.q$LlU943UIOsjStA1sIVlDjJZMf/6ulzN2KcSmlli5o1gnkFfeP8cifa2GRtrSz7wNPF2MMYI6a6umUqwG6opCc.::0:99999:7:::

27.匹配IP地址

  1. 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 只显示匹配到的内容

  1. cat /etc/rc.d/init.d/functions | grep -Eo "^[a-Z]*_*.*\(\)"
  2. a-Z开头重复多次,或者_重复多次 中间是任意字符 末尾是()

29.列出/etc目录下所有以.conf结尾的文件名,并将其大小写转换为大写。
-E 支持扩展正则
-o 只显示匹配到的内容

  1. find /etc -name '*.conf' | grep -Eo "[^/]*(\.conf)$" | tr "a-z" "A-Z"
  2. 匹配除了 / 外的所有字符出现多次,并且以.conf结尾

30.显示/etc/meminfo文件中以大小s开头的行

  1. cat /proc/meminfo | grep '^[sS]'

31.显示/etc/passwd文件中不以/bin/bash结尾的行

  1. cat /etc/passwd | grep -v "/bin/bash$"

32.显示centos7上所有系统用户的用户名和UID

  1. cat /etc/passwd | cut -d":" -f 1,3 | grep -v "root" | grep -v "[0-9]\{4,\}"

33.取出文件/etc/inittab文件中,以#开头,且后面跟一个空格的行

  1. grep "^#[[:space:]]" /etc/inittab