设为首页 收藏本站
查看: 1047|回复: 0

shell脚本 grep重点详解 使用场景

[复制链接]

尚未签到

发表于 2018-8-28 06:46:31 | 显示全部楼层 |阅读模式
  来源:http://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
  2) 使用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 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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557423-1-1.html 上篇帖子: 清空日志shell脚本 下篇帖子: shell进行字符串截取的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表