Linux系统中grep命令可以根据指定的字符串或者正则表达式对文件内容进行匹配查找。在Linux文件处理和SHELL编程中使用广泛。
grep基本语法
用法: grep [选项] "字符串/基本正则表达式" [文件]
常用选项
-c 只输出匹配行的计数。 -i 不区分大小写(只适用于单字符)。 -h 查询多文件时不显示文件名。 -l 查询多文件时只输出包含匹配字符的文件名。 -n 显示匹配行及行号。 -s 不显示不存在或无匹配文本的错误信息。 -v 显示不包含匹配文本的所有行。 -q 不显示存在或者匹配的文本信息 -f 后接文件名,以文件中的每一行作为匹配项 -R 递归查询当前目录下的文件 -w 匹配单词 -o 只输出匹配字符串 -A 输出匹配行的后n行,后带数字,如-A 2 -B 输出匹配行的前n行,后带数字,如-B 2 -C 输出匹配行的前后n行,后带数字,如-C 2
特别说明
1、对于匹配的字符串或者正则表达式需要注意,对于字符串,建议使用双引号,比如"test"、"test test"、"$VAR"等。对于正则表达式,建议使用单引号,比如'[0-9]*test'、'^[0-9]'等
2、文件。可以使用文件全名,比如test.unl、student.txt等,也可以使用模式匹配,比如*表示所有文件、*.unl表示查找所有以.unl后缀的文件,Test*.unl表示以Test开头并以.unl结尾的文件等。
grep常用实例
1、查找包含oracle字符串的行
grep "oracle" /etc/passwd #区分大小写查找带oracle字符串的行 grep -i "oracle" /etc/passwd #不区分大小写查找带oracle字符串的行 grep -ni "oracle" /etc/passwd #不区分大小写查找带oracle字符串的行并显示行号 grep -i '^oracle:' /etc/passwd #查找以oracle:开头用的行
2、统计字符串oracle出现的次数
grep -c "oracle" /etc/passwd
3、显示当前目录下包含字符串"192.168.0.1"的文件名
grep -l "192.168.0.1" * #在当前目录下查找包含192.168.0.1的文件,不包括子目录下文件。*表示查找当前目录下的所有文件 grep -il "192.168.0.1" * #忽略大小写查找包含192.168.0.1的文件,不包括子目录下的文件 grep -ilR "192.168.0.1" * #递归查找当前目录及子目录下包含192.168.0.1的文件
4、去除空行展示文件内容
grep -v '^$' /etc/passwd
5、判断系统是否创建oracle用户。通常用于SHELL编程中判断存在的文件中是否包含字符串,会根据$?返回的结果码进行判断。如下
方法一
grep -q "^oracle:" /etc/passwd #不会输出内容 [ $? -eq 0 ] && echo "Created" || echo "Not Created"
方法二
grep -s "^oracle:" /etc/passwd #不会输出内容 [ $? -ne 0 ] && echo "Created" || echo "Not Created"
6、多个条件查询文件
grep -E 'root|oracle|ftp' /etc/passwd
如果条件过多 ,用上述方法比较繁琐。可以将匹配条件写入一个文件,利用参数-f进行匹配。如果加上-v就标识不匹配
grep -f match.txt /etc/passwd
可以利用这个参数对两个文件内容做交集、差集的操作。
grep -f text1.txt text2.txt grep -v text1.txt text2.txt
7、精确匹配"oracle"单词的行
grep -w "oracle" oracle.txt grep "oracle" oracle.txt
8、显示匹配行的前2行、后2行或者前后2行
grep -A2 'oracle' /etc/passwd #显示匹配行及后2行(After) grep -B2 'oracle' /etc/passwd #显示匹配行及前2行(Before) grep -C2 'oracle' /etc/passwd #显示匹配行及前、后2行
9、查找以ksh结束的行
grep 'ksh$' /etc/passwd
10、从动态刷新的文件中查找并输出匹配关键字的行
tail -f debug.log | grep --line-buffered 'ERROR'
11、排除指定目录递归查找包含'192.168.0.1'的文件
grep -R --exclude-dir=log "192.168.0.1" .
12、匹配到的关键字显色输出。
grep -i --color=auto 'root' /etc/passwd
grep与正则表达式实例
1、查找包含oracle或者Oracle所在的行
grep '[Oo]racle' /etc/passwd #只要包含就列出 grep '^[Oo]racle' /etc/passwd #开头包含的才列出
2、查找oracle后跟2个字符的行
grep 'oracle..' /etc/passwd #oracle后跟2个任意字符 grep 'oracle[0-9][0-9]' /etc/passwd #oracle后跟2个数字 grep 'oracle[0-9]{2}' /etc/passwd #oracle后跟2个数字 grep 'oracle[0-9]{2,5}' /etc/passwd #oracle后跟2个到5个数字 grep 'oracle[0-9]{2,}' /etc/passwd #oracle后跟2个以上数字(包括2个)
grep与其他命令结合实例
1、查询oracle相关进程
ps -ef | grep "ora_" | grep -v grep
2、 查找ORACLE目录是的审计文件并删除
find $ORACLE_BASE -name "*.aud" -print0 | xargs -0 rm -f find $ORACLE_BASE -name "*.aud" -exec rm -f {} ;
3、查找包含192.168.0.1字符串的*.cfg配置文件
find . -name "*.cfg" |xargs grep -l "192.168.0.1"
4、替换*.cfg配置文件中192.168.0.1为192.168.1.1
find . -name "*.cfg" |xargs sed -i 's#192.168.0.1#192.168.1.1#g'