linux搜索过滤——grep
grep在服务端查询消息时经常会被使用到,这里总结几个常用,简单的命令,熟练掌
握可以使查询更为高效。配合正则表达式使用,功能将更加强大。
格式
grep [option] pattern filename
option
1 grep --version 显示grep的版本号
2 -A数字N 找到所有的匹配行,并显示匹配行后面N行
grep -A 2 "a" test.txt //匹配字符“a”后面两行
3 -B 数字N 找到所有的匹配行,并显示匹配行前面N行
grep -B 2 "a" test.txt //匹配字符’a’ 前面两行
4 -b 显示匹配到的字符在文件中的偏移地址 ,即有多少字节
5 -c 显示有多少行被匹配到
grep -c "a" test.txt
6 -e 可以使用多个正则表达式
grep -e "a" -e "1" test.txt //查找txt中字符 ‘a’ 和 字符 ‘1’
7 -f fileA fileB FILEA在FILEAB中的匹配
grep -f test.txt test1.txt
grep -f test1.txt test.txt
8 -i 不区分大小写
grep -i "a" test1.txt //出所有字符’a’ 并且不区分大小写
9 -m数字N 最多匹配N个后停止
grep -m 2 "a" test.txt //匹配2个后停止
10 -n 打印行号
grep -n -m 2 "a" test.txt //打印出匹配字符的行号
11 -o 会打印匹配到的字符
12 -R 搜索子目录
grep "a" * //只在当前目录查找字符’a’
grep -R "a" * //在当前目录和子目录查找字符’a’
13 -v 显示不包括查找字符的所有行
grep -v "a" test.txt
14 -C数字N 列出符合行之外并列出上下各NUM行,预设值是2
15 -x 输出完全匹配内容
pattern
1 ^ 匹配行首
grep -n '^a' test.txt //匹配以字符’a’开头的
2 $ 匹配行尾
grep -n '33$' test.txt //匹配以字符串”33”结束的
3 [ ] 匹配[ ]内的字符(单字符)
grep -n --color '[1-3 a-b]' test.txt
注意,相让[]中的^ - 不表现特殊意义,可以放在[]里面内容的后面。
'[^a-z\.!^ -]' 表示没有小写字母,没有. 没有!, 没有空格,没有- 的 串,注意[]里面有个小
空格。
另外shell 里面的反向选择为[!range], 正则里面是 [^range]
4 . 匹配任意的单字符
grep -n --color '^.3' test.txt //任意字符开头然后第二个字符为 ‘3’
grep -n --color '^..3' test.txt //任意两个字符开头,然后第三个字符为 ‘3’
5 * 紧跟一个单字符,表示匹配0个或者多个此字符
grep -n --color '3*' test.txt //匹配字符’3’ 0次或者多次
.*表示 0个或多个任意字符
6 grep -n --color '23*' test.txt //匹配字符串”23”,但是 ‘3’ 被匹配的次数 >= 0
7 \ 用来屏蔽元字符的特殊含义
echo "365.398" | grep --color '.' //查找任意单字符
echo "365.398" | grep --color '\.' //查找“.”这个字符
8 \? 匹配前面的字符0 次或者1次
grep -n --color '33\?' test.txt //匹配字符串”33”但是 第二个字符‘3’只能匹配0次或
者1次,因此实际匹配到的字符有“33 ”和 ‘3’这两种
grep -n --color '23\?' test.txt //匹配字符串”23”但是 第二个字符‘3’只能匹配0次或
者1次,因此实际匹配到的字符有“23 ”和 ‘2’这两种
9 \+ 匹配前面的字符1次或者多次
grep -n --color '3\+' test.txt
10 X\{m\} 匹配字符X m次 注意,由于{ }在SHELL中有特殊意义,因此作为正则表
达式用的时候要用\转义一下。
grep -n --color '3\{1\}' test.txt
11 X\{m,\} 匹配字符X最少m次
grep -n --color '3\{1,\}' test.txt
12 X\{m,n\} 匹配字符X m---n 次
grep -n --color '3\{0,1\}' test.txt
13 \| 表示或的关系
grep -n "\(ab\|23\)" test.txt
grep与正则表达式
首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!
正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串。vi grep ,awk ,sed 等都支持正则表达式.
1基础正则表达式
grep 工具,以前介绍过。
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即找 没有搜索字符串的行
其中搜索串可以是正则表达式!
2 扩展正则表达式是对基础正则表达式添加了几个特殊构成的。
它令某些操作更加方便。
比如我们要去除 空白行和行首为 #的行, 会这样用:
woody@xiaoc:~/tmp$ grep -v '^$' regular_express.txt | grep -v '^#'
然而使用支持扩展正则表达式的 egrep 与扩展特殊符号 | ,会方便许多。
注意grep只支持基础表达式, 而egrep 支持扩展的,其实 egrep 是 grep -E 的别名而
已。因此grep -E 支持扩展正则。
那么:
woody@xiaoc:~/tmp$ egrep -v '^$|^#'regular_express.txt