9 shell命令之grep

当我们需要在成千上万个文件中找到一个指定的文件,可能我们可以用ls filename . 结果会列出这个文件的一些信息.但这不是最好的方式.或者指定规则的文件的时候,ls显然无法满足我们的需求了.无论上述哪种情况,我们需要一个强大的助手-grep.

grep还有几个变体,分别是egrep, fgrep, rgrep. 在这几个变体里面,我只知道egrep是grep -E .也就是grep的正则变体.

grep [option] "pattern" [filename]

此处之所以把文件名用中括号括起来,是因为文件名可有可无.grep可以从标准输入获取数据.

option可选的选项有很多.因为选项太多了,man手册还特意的给这些选项做了一个分类.看看是啥:

1. 匹配方式选择

    -E   正则匹配

    其它的都没有用过.

2. 匹配控制

    -i   忽略大小写

    -e  可以指定多个pattern

    -f   指定pattern文件,也就是说,可以把要查找的字段放在一个文件中,当指定多个pattern的时候,这个比较常用.

    -v   反向查找.即列出不匹配的.

3. 基本输出控制

    -c   打印匹配行数,不是次数

    --color=...   一般这个值就是auto.指定输出的颜色

    -L   打印不匹配的文件

    -l   打印匹配的文件

    -o   仅打印匹配的pattern

    -q   静默模式,需要通过$? 来检查返回值来确定是否找到匹配的内容

4. 输出行修饰

    -b   打印首字母偏移,注意这个便宜不是匹配字符的偏移,如果要打印匹配字符的偏移需要配合-o选项

    -h/H   前者不带文件名打印,后者带文件名打印.默认打印文件名

    -n   打印文件的第几行匹配了pattern

    -Z   有的时候,一个文件是使用空格作为分隔符的,而空格是作为shell环境的IFS存在的,所以就有可能出现把一个文件名分割成两个文件名的现象.面对这种问题,处理办法是-Z,指定以\0作为字符串的分隔符.

5. 文件和文件夹的选择

    -a   把所有文件都当做是文本文件来处理

    --exclude=...   去除指定的文件

    --exclude-from=FILE   FILE中列出需要忽视的文件名.

    --exlucde-dir=...   忽略掉指定的文件夹


ok吧,就这些吧.光记住这些就已经很头疼了.反正我差不多都记住了.

另外还有三个比较好玩的选项-A -B -C   .  意思分别是,打印匹配前几行,打印匹配后几行,打印匹配前后各几行.-A等后面接一个数字.

   

下面还是看看grep的一些用法吧.

过滤当前文件夹下sh为后缀的文件,然后过滤sh文件中的expect文件.并且打出其前后两行.然后测试-o和-b选项.

技术分享

找到当前目录下,包含bash字符串的文件.有好多is a directory,消除它.

技术分享

只打印匹配的文件名,然后打印不匹配的文件名,然后再看看-H/h的效果.打印出匹配的信息在第几行

技术分享

全目录搜索排除某个目录下的所有文件.这里不知道是不是bug的原因.列出我两次命令的区别.

技术分享

两次输入的区别就是一个带了/一个没有带.结果就不一样.看来以后这个要记住了,收获啊.

正则表达式就不再去介绍了,完全可以写好几篇文章介绍.网上也有很多资源.同学们可以去参考一下.(其实我也是个正则表达式的二把刀)

ok.就介绍这么多吧.每次用grep的时候都感觉知道的好少,突然一总结发现,知道的也不少啊.其实关键还是在运用上面,shell编程就是这样,可能有些命令我们并不知道,但是可以根据我们知道的命令去完成.

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。