美文网首页
grep命令应用实例

grep命令应用实例

作者: MagicalGuy | 来源:发表于2018-11-15 01:03 被阅读0次

    转:https://blog.csdn.net/hello_hwc/article/details/40017833

    Grep
    全称Global Regular Expression Print,表示全局正则表达式
    是一个强大的文本搜索工具,采用正则匹配
    1、命令格式
    grep [options] files

    2、主要参数
    -c: 只输出匹配行的数目
    -i: 不区分大小写
    -n:显示匹配航以及行号
    -l:查询多文件的时候只输出包含匹配字符的文件名
    -v:反向匹配,即显示不匹配的行
    -h: 查询的时候不适用文件名
    -s:不显示错误信息

    3、部分正则表达式
    \ 反义字符:如""""表示匹配""
    ^$ 开始和结束
    [] 单个字符,[A]
    [ - ] 匹配一个范围,[0-9a-zA-Z]匹配所有数字和字母

    • 前面的字符出现0次或者多次
    • 前面的字符出现了一次或者多次
      . 任意字符

    4、经典场景

    除非要精确区分大小写,否则请加上-i来忽略大小写

    (1)结合find命令和管道
    你的一个音乐文件夹里有多种格式的文件,而你只想找到艺术家jay的mp3文件,并且不含有任何的混合音轨

    [root@localhost ~]#find . -name ".mp3" | grep -i jay | grep -vi "remix"
    

    分析:
    1)使用find -name 来列出所有mp3文件,重定向给grep

    1. 使用grep -i 来查找包含jay的行
      3)使用grep -vi 来查找不包含remix的行

    (2)-A -B -C
    很多时候,我们并关心匹配行而是关心匹配行的上下文。这时候-A -B -C就有用了
    -A n 后n行,A记忆为(After)
    -B n 前n行,B记忆为(Before)
    -C n 前n行,后n行,C记忆为(Center)
    举例

    [root@localhost ~]# ifconfig | grep -A 2 "Link encap"
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:F3:38:15  
              inet addr:192.168.91.129  Bcast:192.168.91.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fef3:3815/64 Scope:Link
    --
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
     
     
    [root@localhost ~]#  ifconfig | grep -C 2 "lo"
              Interrupt:67 Base address:0x2024 
     
     
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
    

    (3) 用-c来统计数目
    你手头有一个很大的文件,这个文件包含网址,比如www.baidu.com tieba.baidu.com等等。你想要知道有多少个隶属于百度的网址

    [root@localhost ~]# grep -c "*baidu.com*" filename
    例子
    [root@localhost ~]# cat file.txt
    wtmp begins Mon Feb 24 14:26:08 2014
    192.168.0.1
    162.12.0.123
    "123"
    123""123
    njuhwc@163.com
    njuhwc@gmil.com 123
    www.baidu.com
    tieba.baidu.com
    www.google.com
    www.baidu.com/search/index
    [root@localhost ~]# grep -cn ".*baidu.com.*" file.txt 
    3
    

    (4) -r 递归查找子目录
    查找当前目录极其子目录下面包含匹配字符的文件
    查找子目录,匹配后输出行号,这里的点表示当前目录

    [root@localhost ~]# grep -nr HELLO_HWC_CSND_BLOG* .
    

    例子:

    [root@localhost ~]# grep -nr baidu .
    ./file.txt:8:www.baidu.com
    ./file.txt:9:tieba.baidu.com
    ./file.txt:11:www.baidu.com/search/index
    ./test/test.txt:1:http://www.baidu.com
    

    查找子目录,匹配后只输出文件名

    [root@localhost ~]# grep -lr HELLO_HWC_CSND_BLOG* .
    

    例子:

    [root@localhost ~]# grep -lr baidu .
    ./file.txt
    ./test/test.txt
    

    (5)--line-buffered 打开buffering 模式
    你有一个文件是动态的,它不断地添加信息到文件的尾部,而你想要输出包含某些信息的行。即持续的grep一个动态的流

    [root@localhost ~]#tail -f file | grep --line-buffered your_pattern 
    

    (6)结合ps查找进程

    [root@localhost ~]# ps aux | grep init
    root         1  0.0  0.1   2072   632 ?        Ss   22:52   0:01 init [5]                             
    root      4210  0.0  0.1   6508   620 ?        Ss   23:01   0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients"
    root      4233  0.0  0.0   2780   504 ?        S    23:01   0:00 /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients
    root      4956  0.0  0.1   3920   680 pts/1    R+   23:27   0:00 grep init
    

    这里我们看到了grep init我们执行的命令也被列出来了
    如果不想要这一行,我们可以这么改命令

    [root@localhost ~]# ps aux | grep [i]nit
    root         1  0.0  0.1   2072   632 ?        Ss   22:52   0:01 init [5]                             
    root      4210  0.0  0.1   6508   620 ?        Ss   23:01   0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients"
    root      4233  0.0  0.0   2780   504 ?        S    23:01   0:00 /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients
    

    (7)查找不包含某一个目录

    [root@localhost ~]#grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
    

    例子

    [root@localhost ~]# ls
    anaconda-ks.cfg  Desktop  file.txt  find.result  install.log  install.log.syslog  test
    [root@localhost ~]# grep -r baidu .
    ./file.txt:www.baidu.com
    ./file.txt:tieba.baidu.com
    ./file.txt:www.baidu.com/search/index
    ./test/test.txt:http://www.baidu.com
    

    这时候如果我们不想包含test目录

    [root@localhost ~]# grep -R --exclude-dir=text "baidu" .
    ./file.txt:www.baidu.com
    ./file.txt:tieba.baidu.com
    ./file.txt:www.baidu.com/search/index
    

    如果报错

    grep: unrecognized option `--exclude-dir=test'
    

    说明版本过老,更新下就ok

    (8)查找IP地址
    这里用到了-o和-P命令
    我们通过man grep查看
    -o, --only-matching:
    Show only the part of a matching line that matches PATTERN.
    -P, --perl-regexp:
    Interpret PATTERN as a Perl regular expression.
    也就是说-o,只显示匹配行中匹配正则表达式的那部分
    -P,作为Perl正则匹配

    [root@localhost ~]# cat file.txt
    wtmp begins Mon Feb 24 14:26:08 2014
    192.168.0.1
    162.12.0.123
    "123"
    123""123
    njuhwc@163.com
    njuhwc@gmil.com 123
    www.baidu.com
    tieba.baidu.com
    www.google.com
    www.baidu.com/search/index
    [root@localhost ~]# grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt
    192.168.0.1
    162.12.0.123
    

    (9)查找邮箱

    [root@localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt
    

    例子

    [root@localhost ~]# cat file.txt
    wtmp begins Mon Feb 24 14:26:08 2014
    192.168.0.1
    162.12.0.123
    "123"
    123""123
    njuhwc@163.com
    njuhwc@gmil.com 123
    www.baidu.com
    tieba.baidu.com
    www.google.com
    www.baidu.com/search/index
    [root@localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt
    njuhwc@163.com
    njuhwc@gmil.com
    

    相关文章

      网友评论

          本文标题:grep命令应用实例

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