几乎每次用ps命令时都会用到该命令,接着使用上一篇的例子:
ps -ef|grep tomcat ps -aux |grep tomcat
首先要明白什么是管道(|)
命令
Linux系统中的命令可以将标准输入读取数据,还能将这些数据送到标准输出中去,这种功能被系统进一步的利用,从而产生出一种新的特性,称之为管道符“|”
,这个符号可以将一个命令的标准输出管道为另外一个命令的标准输入。
需要注意的是管道符的使用有两个条件:
1、管道命令只能处理前一个命令的标准输出,而不能处理标准错误; 2、管道命令右边命令必须能够接收标准输入。
这下明白了,那么不难猜测grep就是使用管道的数据进行查找的命令
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
语法格式:
grep [选项] "搜索内容" 文件名
选项说明如下:
-a 不要忽略二进制数据。 -A 数字: 列出符合条件的行,并列出后续的n行 -B 数字: 列出符合条件的行,并列出前面的n行 -b 在显示符合范本样式的那一行之外,并显示该行之前的内容。 -c: 统计找到的符合条件的字符串的次数 -C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。 -d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。 -e<范本样式> 指定字符串作为查找文件内容的范本样式。 -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。 -f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。 -F 将范本样式视为固定字符串的列表。 -G 将范本样式视为普通的表示法来使用。 -h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。 -H 在显示符合范本样式的那一列之前,标示该列的文件名称。 -i 忽略字符大小写的差别。 -l 列出文件内容符合指定的范本样式的文件名称。 -L 列出文件内容不符合指定的范本样式的文件名称。 -n 输出行号 -q 不显示任何信息。 -R/-r 此参数的效果和指定“-d recurse”参数相同。 -s 不显示错误信息。 -v 反向查找 -w 只显示全字符合的列。 -x 只显示全列符合的列。 -y 此参数效果跟“-i”相同。 -o 只输出文件中匹配到的部分 --color=auto 搜索出的关键字用颜色显示
实例-从Tomcat日志查找包含某个关键词的日志
//此时路径在Tomcat下 grep "UserInfoImpl" logs/catalina.out
实例-多条件查询
如从日志查询SQL包含“SELECT” “23244” "10569"关键字的语句,可以如下所示:
grep "SELECT" logs/catalina.out |grep "10569" |grep "23244"
查找用户信息文件/etc/passwd中,有多少可以登录的用户
grep "/bin/bash" /etc/passwd
其同样支持正则搜索
#正则表达式“.”只能匹配一个字符,这个字符可以是任意字符 grep "s..d" test_rule.txt #“*”前一个字符匹配0次,或任意多次 grep "s.*d" test_rule.txt grep "a*" test_rule.txt #“^”代表匹配行首,比如“^M”会匹配以大写“M”开头的行 grep "^M" test_rule.txt #“$”代表匹配行尾,如果“n$”会匹配以小写“n”结尾的行 grep "n$" test_rule.txt #“^$”则会匹配空白行 grep -n "^$" test_rule.txt #“[]” 匹配中括号中指定的任意一个字符,只匹配一个字符 grep "s[ao]id" test_rule.txt #“[^]” 匹配除中括号的字符以外的任意一个字符 grep "^[^a-z]" test_rule.txt
熟悉正则表达式的童鞋应该很疑惑,在正则表达式中应该还可以支持一些元字符,比如“+”“?”“|”“()”。其实Linux是支持这些元字符的,只是grep命令默认不支持而已。如果要想支持这些元字符,必须使用egrep命令或grep -E选项,所以我们又把这些元字符称作扩展元字符。
更多实例如下:
#查找包含有“root”的行,并列出后续的3行 [root@localhost ~]# grep -A 3 "root" /etc/passwd #查找可以登录的用户,并显示行号 [root@localhost ~]# grep -n "/bin/bash" /etc/passwd #查找不含有“/bin/bash”的行,其实就是列出所有的伪用户 [root@localhost ~]# grep -v "/bin/bash" /etc/passwd