迹忆博客
当前位置: 主页 > 学无止境 > 操作系统 > 文章

Linux提取命令grep(二)

发布时间: 2016-09-24 作者: 迹忆 浏览次数:

本篇承接linux提取命令grep(一),继续介绍grep命令的选项及其用法。

选项二

这组我们主要介绍对grep输出信息的进行控制的选项。

-m 当显示的行数达到该选项指定的行数限制的时候即停止输出。也就是说如果-m指定显示行数最大为3,如果检索出来的结果有4行,那也只显示前三行。

# grep mail –m 1 /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin  //只显示一行结果,通过前面的例子我们知道其实含有mail字符串的一共有两行数据。
//or
# grep mail –max-count=1 /etc/passwd    // -m NUM  <=> --max-count=NUM
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin //同样结果也是一行

-n 在输出被检索到的字符串的数据之前同时在前面显示每行数据所在的行号。

# grep mail –n /etc/passwd
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
22:mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
//这两行数据是其在/etc/passwd中所在的行号

-b 匹配到字符串的那些行所在的起始位置,该位置是以字节为单位计算的。意思是说,在改行数据之前有230个字节的数据,那该行的起始位置就是230。

# grep mail –b /etc/passwd
293:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
877:mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

-o 只显示匹配的字符串

# grep mail –o /etc/passwd
mail
mail
mail
mail

-H 在显示的信息前面加上文件名作为前缀,对于检索单个文件来说,默认情况下不用文件名作为前缀。而该选项就是在前面加上文件名作为前缀。

# grep mail –H /etc/passwd
/etc/passwd:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
/etc/passwd:mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

-h 该选项和-H的功能正相反,是取出文件名作为前缀。该选项用于多文件检索的时候,因为单文件检索默认情况下是没有文件名前缀的。

# grep mail /etc/passwd /etc/group
/etc/passwd:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
/etc/passwd:mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
/etc/group:mail:x:12:mail
/etc/group:mailnull:x:47:
//多文件检索会在每一行前面加上改行所在的文件名作为前缀
#grep mail –h /etc/passwd /etc/group
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
mail:x:12:mail
mailnull:x:47:
//此时结果中就没有文件名的前缀了

-q 不显示标准输出的信息,即使检索到字符串也不会显示。该选项和-s有点类似,-s是将标准错误输出给屏蔽掉,而该选项是屏蔽标准输出信息。

# grep mail –q /etc/passwd
//结果为空
# grep mail –q /etc/passwd /etc/passwds
grep: /etc/passwds: No such file or directory
//我们看,对于错误信息-q并不会屏蔽
# grep mail –qs /etc/passwd /etc/passwds
//什么也不显示,标准输出和标准错误输出都被屏蔽掉了

-c 小写c,显示匹配到指定字符串的行数

# grep mail –c /etc/passwd
2

-d ACTION 如果输入文件是一个目录,我们要使用该选项后面跟上ACTION来处理。ACTION的默认值是read,表示目录就像普通文件一样被读取;如果ACTION是skip,那么就会跳过该目录;如果ACTION是recurse,grep就会读取该目录下的所有的文件作为数据源(相当于grep的-r选项)。针对recurse我们举一个例子——查找/etc目录下的所有文件的内容,检索包含以mail作为开头的行数据

# grep ^mail –d recurse /etc
/etc/passwd:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
/etc/passwd:mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
/etc/mail/helpfile:mail MAIL From:<sender> [ <parameters> ]
/etc/mail/helpfile:mail         Specifies the sender.  Parameters are ESMTP extensions.
/etc/mail/helpfile:mail         See "HELP DSN" for details.
……
//等价于
# grep ^mail –r /etc
//结果相同。

同时我们在这里也顺便介绍了-r选项的用法。还有复习-h选项的用途,因为检索了目录的所有文件,所以会在每行结果前加上文件名作为前缀。可以用-h去掉

# grep ^mail –hd recurse /etc  //这里注意 h和d的顺序
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
mail    MAIL From:<sender> [ <parameters> ]
mail            Specifies the sender.  Parameters are ESMTP extensions.
mail            See "HELP DSN" for details.
mail.*                                                  -/var/log/maillog
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
mail:*:16619:0:99999:7:::
mailnull:!!:16619:0:99999:7:::
…..

-D ACTION 该选项和-d基本相同,只是输入文件是一个设备的时候(FIFO或者socket)使用该选项,其ACTION和-d的相同,只是没有recurse。这里就不再举例子。

-a 将binary 文件以text文件的方式检索数据

-I 大写的I  忽略binary文件

查找pdo下面所有文件,检索出含有main的数据。

# grep main –a –r /software/php-5.5.23 /ext/pdo 
// pdo下面的二进制文件会被当做普通文本文件来检索  相当于–binary-files=text。
# grep main –binary-files=text –r /software/php-5.5.23 /ext/pdo
//结果同-a相同

对于pdo下面的二进制文件会进行忽略

# grep main –I –r /software/php-5.5.23 /ext/pdo
//相当于 –binary-files=without-match
# grep main –binary-files=without-match –r /software/php-5.5.23 /ext/pdo
//结果同-I 相同

-L 同-l相反,显示文件内容不包含检索字符串的文件名 等价于 --files-without-match

-l 显示包含检索字符串的数据所在的文件的文件名 等价于 --files-with-matches

# grep main -l -r /software/php-5.5.23/ext/ftp
/software/php-5.5.23/ext/ftp/package.xml
//或者
# grep main --files-with-matches -r /software/php-5.5.23/ext/ftp
//结果同上
# grep main –L –r /software/php-5.5.23/ext/ftp
/software/php-5.5.23/ext/ftp/php_ftp.h
/software/php-5.5.23/ext/ftp/tests/006.phpt
/software/php-5.5.23/ext/ftp/tests/ftp_exec_basic.phpt
/software/php-5.5.23/ext/ftp/tests/ftp_nb_get_large.phpt
/software/php-5.5.23/ext/ftp/tests/ftp_get_basic.phpt
….
//部分结果,所有的显示结果中唯独没有/software/php-5.5.23/ext/ftp/package.xml这个文件
//或者
# grep main --files-without-match –r /software/php-5.5.23/ext/ftp

-A NUM在检索到的结果后面添加NUM行数据,这些数据就是目标行数据下面挨着的NUM行数据

-B NUM 同-A相反,是在结果前面添加NUM行数据

-C NUM 在结果前后都添加NUM行数据

# grep mail –B 1 /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
--
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
# grep mail –A 1 /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
--
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
# grep mail –C 1 /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
--
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

本篇先介绍这些选项,其余的选项我们在linux提取命令grep(三)中介绍。

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: