linux's docs

12.2.0: 正则基础-grep


1. grep

作用:主要用于查询功能的字符串处理工具
语法:grep [参数] '查询关键字' file
参数:

  • -c 打印符合要求的行数
  • -n 在输出符合要求的行的同时连同行号一起输出
  • -v 取反,输出不符合要求的行
  • -A n after 表示将每条符合要求的记录之后n行一同输出
  • -B n before表示将每条符合要求的记录之前n行一同输出
  • -C n 相当于A和B的组合,表示将每条符合要求的记录前后n行一同输出
  • -r 会把目录下面所有的文件全部遍历
  • -q 并不输出内容,只返回结果值
  • -o 只返回匹配的关键字
  • -l 只返回包含此字符串的文件或来源

正规表示法适配: 默认是基本的正规表示法,"-E"后变成egrep,支持扩展正规表示法

用法举例:

# 用"-r"参数搜索目录下所有文件中的字符串

# 搜索fugai目录下所有文件中有"root"的行
grep -nr "root" fugai
fugai/pass:1:root:x:0:0:root:/root:/bin/bash
fugai/pass:11:operator:x:11:0:operator:/root:/sbin/nologin
fugai/pass1:1:root:x:0:0:root:/root:/bin/bash
fugai/pass1:11:operator:x:11:0:operator:/root:/sbin/nologin


# 用"-c"参数来统计符合条件结果的行数

grep -c 'root' /etc/passwd
2


# 参数"-A"、"-B"和"-C"范例
# 匹配行行号后面是":"
# 而"-A"、"-B"、"-C"参数匹配的两行用的是"-"

# 指定匹配行后两行输出
grep -n -A2 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
11:operator:x:11:0:operator:/root:/sbin/nologin
12-games:x:12:100:games:/usr/games:/sbin/nologin
13-gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

# 指定匹配行前两行输出
grep -n -B2 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
--
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11:operator:x:11:0:operator:/root:/sbin/nologin

# A和B参数的合体,-C前后两行都输出
grep -n -C2 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11:operator:x:11:0:operator:/root:/sbin/nologin
12-games:x:12:100:games:/usr/games:/sbin/nologin
13-gopher:x:13:30:gopher:/var/gopher:/sbin/nologin


# 匹配IP或电话号码

echo -e "192.168.0.1\n192.0.1"
192.168.0.1
192.0.1
# 两种方式来匹配ip
echo -e "192.168.0.1\n192.0.1" | \
> grep -E "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+"
192.168.0.1
echo -e "192.168.0.1\n192.0.1" | \
> grep -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
192.168.0.1
# 因为bash使用的是标准的POSIX正则,所以\d匹配数字是无效的
# 反而是vim工具内部支持\d匹配数字,详情可参照12.1编码符号含义


# grep的-q和-o参数

# -q参数,不打印匹配字符串,只返回成功值
grep -q "root" /etc/passwd && echo "done" || echo "failed"
done

# -o参数,只打印匹配的字符
grep -o 'roo' /etc/passwd
roo
roo
roo
roo

铭哥分享的例子
grep -n 'root' 1.txt (关键字,行号)
grep -n -v 'root' 1.txt (关键字,行号,取反)
grep '[0-9]' 1.txt (包含数字的行)
grep -v '[0-9]' 1.txt (包含数字的行,取反)
grep -v '^#' 1.txt (#开头的行,取反)
grep -v '^$' 1.txt|grep -v '^#' (空行与#开头的行,取反)
grep '^[a-zA-Z]' 1.txt (以字母开头的行)
grep '^[^0-9]' 1.txt (首字母不是数字的行)
grep 'r.o' 1.txt; grep 'rt' 1.txt; grep 'r.t' 1.txt
grep 'o{2}' 1.txt (o重复两次)


2. egrep

介绍:
egrep等同于"grep -E",变化为支持扩展正规表示法,并且不用脱意
其他用法与grep相同

Contents