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的行
注意:
- 引号可以是双引号,也可以是单引号。
- 引号中不能添加额外的空格。
-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。
注意:
- 此处需要指定dirname,而不是filename。
- 如果指定的是filename,则只会在filename中搜索,而不会递归目录。
4. 输出内容相关的选项
-A/-B/-C 抓取匹配行之前、之后的行
grep -A2 a0 filename # 抓取匹配a0的行,同时抓取之后2行。
grep -B3 a0 filename # 抓取匹配a0的行,同时抓取之前3行。
grep -C1 a0 filename # 抓取匹配a0的行,同时抓取前后各1行。
说明:
- -A after
- -B before
- -C center
- -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 |