grep常用用法
支持的正则 描述
-E,--extended-regexp 模式是扩展正则表达式(ERE)
-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 递归目录
-c,--count 只打印每个文件匹配的行数
--include=FILE_PATTERN 只检索匹配的文件
--exclude=FILE_PATTERN 跳过匹配的文件
--exclude-from=FILE 跳过匹配的文件,来自文件模式
--exclude-dir=PATTERN 跳过匹配的目录
内容行控制 描述
-B,--before-context=NUM 打印匹配的前几行
-A,--after-context=NUM 打印匹配的后几行
-C,--context=NUM 打印匹配的前后几行
--color[=WHEN], 匹配的字体颜色
[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! --color=auto :可以将找到的关键词部分加上颜色的显示喔!
你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可喔! 这样每次运行 grep 他都会自动帮你加上颜色显示啦
将/etc/passwd,将没有出现 root 的行取出来
# grep -v root /etc/passwd
用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示:
[root@www ~]# dmesg | grep -n --color=auto 'eth' #列出行号,+颜色
[root@www ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth' #前两行及后三行也都被显示出来,-C3表示前后3行
根据文件内容递归查找目录
# grep ‘energywise’ * #在当前目录搜索带'energywise'行的文件 # grep -r ‘energywise’ * #在当前目录及其子目录下搜索'energywise'行的文件
# grep -l -r ‘energywise’ * #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
这几个命令很使用,是查找文件的利器。
grep与正规表达式
字符类
[root@www ~]# grep -n 't[ae]st' regular_express.txt 8:I can't finish the test. 9:Oh! The soup taste good. #test 或 tast
[root@www ~]# grep -n '[^g]oo' regular_express.txt #取反
[root@www ~]# grep -n '[^a-z0-9]oo' regular_express.txt #[a-zA-Z0-9]。
行首与行尾字节 ^ $
[root@www ~]# grep -n '^the' regular_express.txt
[root@www ~]# grep -n '^[a-z]' regular_express.txt
[root@www ~]# grep -n '^[^a-zA-Z]' regular_express.txt #不想要开头是英文字母
[root@www ~]# grep -n '\.$' regular_express.txt #转义字符(\)来加以解除小数点的特殊含义
[root@www ~]# grep -n '^$' regular_express.txt #找出空白行
任意一个字节 . 与重复字节 *
这两个符号在正则表达式的意义如下:
. (小数点):代表『一定有一个任意字节』的意思; * (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态
[root@www ~]# grep -n 'g..d' regular_express.txt
[root@www ~]# grep -n 'ooo*' regular_express.txt
[root@www ~]# grep -n 'goo*g' regular_express.txt
[root@www ~]# grep -n 'g.*g' regular_express.txt
[root@www ~]# grep -n '[0-9][0-9]*' regular_express.txt
限定连续 RE 字符范围 {}
[root@www ~]# grep -n 'o\{2\}' regular_express.txt [root@www ~]# grep -n 'go\{2,5\}g' regular_express.txt [root@www ~]# grep -n 'go\{2,\}g' regular_express.txt 扩展grep(grep -E 或者 egrep): 使用扩展grep的主要好处是增加了额外的正则表达式元字符集。
打印所有包含NW或EA的行。如果不是使用egrep,而是grep,将不会有结果查出。
# egrep 'NW|EA' testfile northwest NW Charles Main 3.0 .98 3 34 eastern EA TB Savage 4.4 .84 5 20
对于标准grep,如果在扩展元字符前面加\,grep会自动启用扩展选项-E。
#grep 'NW\|EA' testfile northwest NW Charles Main 3.0 .98 3 34 eastern EA TB Savage 4.4 .84 5 20
搜索所有包含一个或多个3的行。
# egrep '3+' testfile # grep -E '3+' testfile # grep '3\+' testfile
搜索所有包含0个或1个小数点字符的行。
# egrep '2\.?[0-9]' testfile
# grep -E '2\.?[0-9]' testfile
# grep '2\.\?[0-9]' testfile
搜索一个或者多个连续的no的行。
# egrep '(no)+' testfile # grep -E '(no)+' testfile # grep '\(no\)\+' testfile #3个命令返回相同结果, northwest NW Charles Main 3.0 .98 3 34 northeast NE AM Main Jr. 5.1 .94 3 13 north NO Margot Weber 4.5 .89 5 9
不使用正则表达式
fgrep 查询速度比grep命令快,但是不够灵活:它只能找固定的文本,而不是规则表达式。
如果你想在一个文件或者输出中找到包含星号字符的行
fgrep '*' /etc/profile 或 grep -F '*' /etc/profile
示例:
1)输出 b 文件中在 a 文件相同的行
# grep -f a b
2)输出 b 文件中在 a 文件不同的行
# grep -v -f a b
3) 匹配多个模式
# echo "a bc de" |xargs -n1 |grep -e 'a' -e 'bc
a
bc
4)去除空格 http.conf 文件空行或开头#号的行
# grep -E -v "^$|^#" /etc/httpd/conf/httpd.conf
5) 匹配开头不分大小写的单词
# echo "A a b c" |xargs -n1 |grep -i a
或
# echo "A a b c" |xargs -n1 |grep '[Aa]'
A
a
6)只显示匹配的字符串
# echo "this is a test" |grep -o 'is'
is
is
7)输出匹配的前五个结果
# seq 1 20 |grep -m 5 -E '[0-9]{2}'
10
11
12
13
14
8)统计匹配多少行
# seq 1 20 |grep -c -E '[0-9]{2}'
11
9) 匹配 b 字符开头的行
# echo "a bc de" |xargs -n1 |grep '^b'
bc
10) 匹配 de 字符结尾的行并输出匹配的行
# echo "a ab abc abcd abcde" |xargs -n1 |grep -n 'de$'
5:abcde
11) 递归搜索/etc 目录下包含 ip 的 conf 后缀文件
# grep -r '192.167.1.1' /etc --include *.conf
12) 排除搜索 bak 后缀的文件
# grep -r '192.167.1.1' /opt --exclude *.bak
13) 排除来自 file 中的文件
# grep -r '192.167.1.1' /opt --exclude-from file
14) 匹配 41 或 42 的数字
# seq 41 45 |grep -E '4[12]'
41
42
15) 匹配至少 2 个字符
# seq 13 |grep -E '[0-9]{2}'
10
11
12
13
16) 匹配至少 2 个字符的单词,最多 3 个字符的单词
# echo "a ab abc abcd abcde" |xargs -n1 |grep -E -w -o '[a-z]{2,3}'
ab
abc
17) 匹配所有 IP
# ifconfig |grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
18) 打印匹配结果及后 3 行
# seq 1 10 |grep 5 -A 3
5
6
7
8
19) 打印匹配结果及前 3 行
# seq 1 10 |grep 5 -B 3
2
3
4
5
20) 打印匹配结果及前后 3 行
# seq 1 10 |grep 5 -C 3
2
3
4
5
6
7
8
不显示输出
不显示错误输出:
# grep 'a' abc
grep: abc: No such file or directory
# grep -s 'a' abc
# echo $?
2
不显示正常输出,可以通过$?判断结果:
# grep -q 'a' a.txt