linux工具-grep

1. 基本语法

grep keyword filename # 基本grep,在filename中搜索keyword
grep keyword *.txt    # 搜索多个文件
grep "a.*" filename   # 在模式中使用regexp,格式与python regexp相同,单双引号都行。
zgrep keyword filename.gz # 在压缩文件中搜索

2. 模式相关的选项

-e 指定多个模式/搜索以-开头的字符

grep -e a0 -e d3 filename # 匹配a0的行 或 匹配d3的行
# 待搜索的字符以-开头, 如果不加-e选项, grep会把-9当作grep的选项而不是当作待搜索字符.
grep -e -9 a.txt
grep -e '-9' a.txt

-E 增强模式

grep -E "a0|d3" filename # 匹配a0的行 或 匹配d3的行

注意:

  1. 引号可以是双引号,也可以是单引号。
  2. 引号中不能添加额外的空格。

-i 忽略大小写

grep -i Yes filename # 会搜到YES、Yes、yes等。

-v 不匹配keyword的行

grep -v a0 filename # 搜索不匹配a0的行。

-w 按单词搜索

grep -w is filename # 搜索匹配is的行,但is必须是完整单词,不会搜索到this、history等

-x 按整行搜索

grep -x ab filename # 只有行内容只有ab时才能匹配, 如果是abc则不匹配.

3. 文件名相关的选项

-r 递归目录文件进行搜索

grep -r a0 dirname # 在当前目录及子目录的全部文件中搜索a0。

注意:

  1. 此处需要指定dirname,而不是filename。
  2. 如果指定的是filename,则只会在filename中搜索,而不会递归目录。

4. 输出内容相关的选项

-A/-B/-C 抓取匹配行之前、之后的行

grep -A2 a0 filename # 抓取匹配a0的行,同时抓取之后2行。
grep -B3 a0 filename # 抓取匹配a0的行,同时抓取之前3行。
grep -C1 a0 filename # 抓取匹配a0的行,同时抓取前后各1行。

说明:

  1. -A after
  2. -B before
  3. -C center
  4. -A2,A和2中间可以有空格,也可以没空格

-c 返回匹配行的数目

grep -c a0 filename # 返回一个数字0~N,匹配a0的行的数目。

注意:如果filename是多个文件,返回内容就不只是一个数字了,而是一个列表,列表元素是filename:N.

-l 只显示文件名

grep -l keyword *.txt # 返回一个list,list元素是文件名,只有文件内容包含keyword的文件名会被返回,其它文件名不返回。

-n 显示行号

# 不使用-n时,返回keyword所在的行文本line_text,使用-n时返回line_num:line_text.
# 如果filename是多个文件,则返回 filename:line_num:line_text.
grep -n keyword filename

5. 使用正则表达式:

grep支持的正则:

元字符 说明 举例
^和$ 行首和行尾 grep ^ab$ a.txt
. 任意字符 grep a.*b a.txt
|转义元字符 grep \^ a.txt
* 前面字符重复0到多次 grep a.*b a.txt
[list]或[^list] 一系列字符 grep a[bc] a.txt
[n1-n2] 字符范围内的一个字符 grep [0-9] a.txt

egrep额外支持的正则:

元字符 说明 举例
前面的字符重复n1~n2次 egrep c{2.5} a.txt
+ 重复前面字符1到多次 egrep c+ a.txt
? 重复前面字符0到1次
| 或, pattern要写在引号中, 否则报错 egrep ‘abc
() 匹配括号内整个字符串 egrep 'g(oo
posted @ 2020-09-10 11:02  编程驴子  阅读(185)  评论(0编辑  收藏  举报