美文网首页
Shell文本三剑客--grep

Shell文本三剑客--grep

作者: 小啊小狼 | 来源:发表于2020-10-28 11:40 被阅读0次

    一、简介

    grep的全称是global regular expression print,是linux中最强大的文本搜索命令之一,常用于搜索文本文件中是否含有某些特定模式的字符串。该命令以行为单位读取文本并使用正则表达式进行匹配,匹配成功后打印出该行文本。

    二、语法

    grep [option] pattern [file1, file2, ...]
    

    常用option选项:

    -n :显示行号
    -o :只显示匹配的内容
    -q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
    -r :递归搜索对目录下的所有文件进行搜索
    -l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
    -A :如果匹配成功,则将匹配行及其后n行一起打印出来
    -B :如果匹配成功,则将匹配行及其前n行一起打印出来
    -C :如果匹配成功,则将匹配行及其前后n行一起打印出来
    -c :如果匹配成功,只输出匹配的行的数量统计
    -E :等于egrep,支持拓展正则表达式
    -i :忽略大小写
    -v :取反,不匹配
    -w :匹配整个单词

    常用的pattern规则表达式

    表达式 一个普通标题
    ^ 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
    $ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
    . 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
    匹配0或者一个字符 如:'gr?p'匹配g后接一个或0个r字符,然后是p。
    * 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
    .* 一起用代表任意字符。
    [] 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
    [^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
    (..) 标记匹配字符,如'(love)',love被标记为1。
    < 锚定单词的开始,如:'<grep'匹配包含以grep开头的单词的行。
    > 锚定单词的结束,如'grep>'匹配包含以grep结尾的单词的行。
    x{m} 重复字符x,m次,如:'o{5}'匹配包含5个o的行。
    x{m,} 重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。x{m,n} # 重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5--10个o的行。
    \w 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
    \W \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
    \b 单词锁定符,如: '\bgrep\b'只匹配grep。

    三、常见用法举例

    1、在文件中搜索一个字符串,返回包含此字符串的文本行:

    [root@liang shell]# grep xy text0001.txt 
    4  xy      100     50    60    70 
    [root@liang shell]# grep "xy" text0001.txt 
    4  xy      100     50    60    70 
    

    在多个文件中搜索,-n显示行号

    [root@liang shell]# grep -n "xy" text0001.txt text0002.txt text0003.txt 
    text0001.txt:5:4  xy      100     50    60    70 
    text0002.txt:1:xy
    text0002.txt:5:xyxyxy
    text0002.txt:7:grepxy
    text0003.txt:1:xy
    text0003.txt:2:xxy
    text0003.txt:4:xxyy
    text0003.txt:5:xyxyxy
    text0003.txt:7:grepxy
    

    搜索一个目录下的所有文件,列出包含指定字符串的文件名 -l

    [root@liang shell]# grep -rl "xxy" ./
    ./text0003.txt
    

    2、统计文件或者文本中包含匹配字符串的行数-c 选项

    统计单个文件

    [root@liang shell]# grep -r -c "xxy" text0003.txt
    2
    

    统计多个文件

    [root@liang shell]# grep -c "xy" text0001.txt text0002.txt text0003.txt 
    text0001.txt:1
    text0002.txt:3
    text0003.txt:5
    

    统计一个目录下的所有文件

    [root@liang shell]# grep -cr "xy" dirpath
    

    3、使用正则表达式 -E 选项

    正则匹配符合条件的字符串显示匹配到的行

    [root@liang shell]# cat text0001.txt 
    ID Name    PHP   Linux  MySQL Average
    1  Liming  82      95    86    87.66
    2  Sc      74      96    87    85.66
    3  Gao     99      83    93    91.66
    4  xy      100.00     50    60    70 
    this is a. test line.
    1105
    [root@liang shell]# grep -E "[0-9]{3}" text0001.txt
    4  xy      100.00     50    60    70 
    1105
    

    -o只输出匹配到的内容

    [root@liang shell]# echo this is a. test line. | grep -o -E "[a-z]+\."
    a.
    line.
    
    其他常用用法

    请对照常用的pattern规则表达式理解

    grep -E 'x?y' text0002.txt    x出现0-1次,y出现1次
    grep -E 'x*y' text0002.txt    x出现0-任意次,y出现1次
    grep -E 'x{n}y' text0002.txt  x出现n次,y出现1次
    grep -E 'x+y' text0002.txt    x出现1-任意次,y出现1次
    grep -E 'x.y' text0002.txt    xy中间有1个任意非换行符
    grep -E 'x.*y' text0002.txt   xy中间有任意个任意非换字符
    

    4、不支持正则,按字面意思匹配(字符串匹配) -F

    [root@liang shell]# grep -E 'x.*y' text0002.txt
    xy
    xcxcy
    xxyxyxy
    abx344dyc
    grepx2y
    x.*y
    xxxxxxxxy
    [root@liang shell]# grep -F 'x.*y' text0002.txt
    x.*y
    

    5、忽略匹配样式中的字符大小写:-i

    [root@liang shell]# echo "hello world" | grep -i "HELLO"
    hello world
    

    6、打印匹配到的行之前或者之后的行

    打印之前的行

    [root@liang shell]# grep "test" -A 2 text0001.txt
    this is a. test line.
    1105
    DSF
    

    打印之后的行

    [root@liang shell]# grep "test" -B 2 text0001.txt
    3  Gao     99      83    93    91.66
    4  xy      100.00     50    60    70 
    this is a. test line.
    

    打印前后的行

    [root@liang shell]# grep "test" -C 2 text0001.txt
    3  Gao     99      83    93    91.66
    4  xy      100.00     50    60    70 
    this is a. test line.
    1105
    DSF
    

    如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:


    image.png

    7、-w 匹配整个单词

    [root@liang shell]# grep 'gr' text0002.txt
    grp
    gr dfd
    xxgrpp
    [root@liang shell]# grep -w 'gr' text0002.txt
    gr dfd
    

    相关文章

      网友评论

          本文标题:Shell文本三剑客--grep

          本文链接:https://www.haomeiwen.com/subject/iwrqvktx.html