Linux基本指令(9)——grep

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       [ ]    匹配[ ]内的字符(单字符)     

        可以使用单字符    可以用^符号做[]内的前缀,表示除[]内的字符之外的字符。
        如 [ 1] 即匹配含有字符’1’的字符串(示例1),
        如 [ a] 即匹配含有字符’a’的字符串(示例2),    grep -n --color '[a]' test.txt
        如 [ 1 2 3 ] 即匹配含有字符’1’ 或者 ’2’ 或者’3’ 的字符串(示例3),    grep -n --color  '[1 2 3]' test.txt
        也可以使用字符序列,用字符 ‘-’ 代表字符序列    grep -n --color '[1-3]' test.txt
        如 [ 1-3 ] 即匹配含有字符’1’ 或者 ’2’ 或者’3’ 的字符串(示例4) 
        如 [ 1-3  a-b] 即匹配含有字符’1’ 或者 ’2’ 或者’3’ 或者 ’a’ 或者 ’b’的字符串(示例5)

            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



猜你喜欢

转载自blog.csdn.net/qq_36117775/article/details/80360651