SHELL三剑客之grep

时间:Jan. 8, 2017 分类:

目录:

grep介绍

过滤来自一个文件或标准输入匹配模式内容。

除了 grep 外,还有 egrep、fgrep。egrep 是 grep 的扩展,相当于 grep -E。fgrep 相当于 grep - f,用的少。

Usage: grep [OPTION]... PATTERN [FILE]... 支持的正则 | 描述 ---|--- -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 | 打印不匹配的行

输出控制 描述
-m,--max-count=NUM 输出匹配的结果 num 数
-n,--line-number 打印行号
-H,--with-filename 打印每个匹配的文件名
-h,--no-filename 不输出文件名
-o,--only-matching 只打印匹配的内容
-q,--quiet 不输出正常信息
-s, --no-messages 不输出错误信息
-r,--recursive 递归目录
--include=FILE_PATTERN 只搜索匹配的文件
--exclude=FILE_PATTERN 跳过匹配的文件
--exclude-from=FILE 跳过匹配的文件,来自文件模式
--exclude-dir=PATTERN 跳过匹配的目录
-c,--count 只打印每个文件匹配的行数
内容行控制 描述
-B,--before-context=NUM 打印匹配的前几行
-A,--after-context=NUM 打印匹配的后几行
-C,--context=NUM 打印匹配的前后几行
--color[=WHEN] 匹配的字体颜色

示例:

打印两个文件相同的行,可以理解为-f a为匹配项,而b为grep处理的文件,2同理

grep -f a b

输出 b 文件中在 a 文件没有的行

grep -v -f a b

匹配多个模式,xargs -n1是把字符串换行输出

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

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

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

匹配开头不分大小写的单词

echo "A a b c" |xargs -n1 |grep -i a
或
echo "A a b c" |xargs -n1 |grep [Aa]

只显示匹配的字符串

echo "this is a test" |grep -o 'is'

输出匹配的前五个结果

seq 1 20 |grep -m 5 -E '[0-9]{2}'

统计匹配多少行

seq 1 20 |grep -c -E '[0-9]{2}'

匹配 b 字符开头的行

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

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

echo "a ab abc abcd abcde" |xargs -n1 |grep -n 'de$'

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

grep -r '192.167.1.1' /etc --include *.conf

排除搜索 bak 后缀的文件

grep -r '192.167.1.1' /opt --exclude *.bak

排除来自 file 文件的文件

grep -r '192.167.1.1' /opt --exclude-from file

匹配 41 或 42 的数字

seq 41 45 |grep -E '4[12]'

匹配至少 2 个字符

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

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

echo "a ab abc abcd abcde" |xargs -n1 |grep -E -w -o '[a-z]{2,3}'

匹配 IP

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

打印匹配结果及后 3 行

seq 1 10 |grep 5 -A 3

打印匹配结果及前 3 行

seq 1 10 |grep 5 -B 3

打印匹配结果及前后 3 行

seq 1 10 |grep 5 -C 3

不显示输出

不显示错误输出:

grep 'a' abc
grep: abc: No such file or directory
grep -s 'a' abc
echo $?
2

不显示正常输出:

grep -q 'a' a.txt