grep
1、简介
grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。通常grep有三种版本grep、egrep(等同于grep -E)和fgrep。egrep为扩展的grep,fgrep则为快速grep(固定的字符串来对文本进行搜索,不支持正则表达式的引用但是查询极为快速)。grep是Linux文本处理三剑客之一。
2、grep的使用方式
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用选项:
1、支持的正则
支持的正则 | 描述 |
-E,--extended-regexp | 模式是扩展正则表达式(ERE) |
-F,--fixed-strings | 模式是换行分隔固定字符串 |
-G,--basic-regexp | 模式是基本正则表达式(BRE) |
-P,--perl-regexp | 模式是Perl正则表达式 |
-e,--regexp=PATTERN | 使用模式匹配,可指定多个模式匹配 |
-f,--file=FILE | 从文件每一行获取模式 |
-i,--ignore-case | 忽略大小写 |
-w,--word-regexp | 模式匹配整个单词 |
-x,--line-regexp | 模式匹配整行 |
-v,--invert-match | 打印不匹配的行 |
2、输出控制
输出控制 | 描述 |
-m,--max-count=NUM | 输出匹配的结果 num 数 |
-n,--line-number | 打印行号 |
-H,--with-filename | 打印每个匹配的文件名 |
-h,--no-filename | 不输出文件名 |
-o,--only-matching | 只打印匹配的内容 |
-q,--quiet | 不输出正常信息 |
-s, --no-messages | 不输出错误信息 |
-r,--recursive | 递归目录 |
-c,--count | 只打印每个文件匹配的行数 |
3、内容行控制
内容行控制 | 描述 |
-B,--before-context=NUM | 打印匹配的前几行 |
-A,--after-context=NUM | 打印匹配的后几行 |
-C,--context=NUM | 打印匹配的前后几行 |
--color[=WHEN] | 匹配的字体颜色 |
示例:
1、输出a文件和b文件相同的行
grep -f a.txt b.txt
2、输出 b 文件中在 a 文件不同的行
grep -v -f a.txt b.txt
3、只显示匹配的字符串
echo "this is a test" |grep -o 'is'
4、输出匹配的前五个结果
seq 1 20 |grep -m 5 -E '[0-9]{2}'
5、统计匹配多少行
seq 1 20 |grep -c -E '[0-9]{2}'
6、匹配 b 字符开头的行
echo "a bc de dab be" |xargs -n1 | grep '^b'
xargs -n1 :表示每次传递一个参数
7、 匹配 de 字符结尾的行并输出匹配的行
echo "a bc de dab be" |xargs -n1 | grep -n 'de$'
8、递归搜素$PWD下包含sql的.sh后缀的文件
grep -r 'sql' $PWD --include *.sh
grep sql fqz*
9、匹配至少 2 个字符
echo 'abc dce a gg dafdf gadgadgae' |xargs -n1 | grep -E '{2}'
10、匹配至少 2 个字符的单词,最多 3 个字符的单词
echo 'abc dc e' |xargs -n1 | grep -E -w '[a-z]{2,3}'
11、匹配所有ip
ifconfig |grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
12、打印匹配结果及后 3 行
seq 1 10 |grep 5 -A 3
13、打印匹配结果及前 3 行
seq 1 10 |grep 5 -B 3
14、打印匹配结果及前后 3 行
seq 1 10 |grep 5 -C 3