grep的简单理解
概述:
grep最早由肯·汤普逊写成。原先是ed下的一个应用程序,名称来自于g/re/p(globally search a regular expression and print,以正则进行全域查找以及打印)。在ed下,输入g/re/p这个命令后,会将所有匹配‘定义样式’的字符串,以行为单位打印出,但是并不对原文件内容进行修改。grep命令在对一个或多个文件的内容进行基于模式搜索的情况下是非常有用的。模式可以是单个字符、多个字符、单个单词、或者是一个句子。当然最有用的还是正则。
例1 在文件中查找模式(单词)
1 grep match_pattern file_name #标记匹配颜色加 --color=auto 选项
2 grep "match_pattern" file_name
例2 在多个文件中查找模式。
grep "match_pattern" file_1 file_2 file_3 ...
例3 使用-l参数列出包含指定模式的文件的文件名。
root@linux:~# grep -l root /etc/passwd /etc/shadow /etc/fstab
例4 使用-n参数,在文件中查找指定模式并显示匹配行的行号,-c只计算匹配了多少行。
grep "text" -n file_name
cat file_name | grep "text" -n
grep "text" -n file_1 file_2 #多个文件
使用正则表达式 -E 选项:
grep -E "[1-9]+"
egrep "[1-9]+"
只输出文件中匹配到的部分 -o 选项:
echo this is a test line. | grep -o -E "[a-z]+\."
line.
echo this is a test line. | egrep -o "[a-z]+\."
line.
例5 使用-v参数输出不包含指定模式的行
grep -v "match_pattern" file_name
#只在目录中所有的.php和.html文件中递归搜索字符 grep "main()" . -r --include *.{php,html} #在搜索结果中排除所有README文件 grep "main()" . -r --exclude "README" #在搜索结果中排除filelist文件列表里的文件 grep "main()" . -r --exclude-from filelist
例6 使用 ^ 符号输出所有以某指定模式开头的行
例7 使用 $ 符号输出所有以指定模式结尾的行。
例8 使用 -r 参数递归地查找特定模式
grep -r root /etc/ #上面的命令将会递归的在/etc目录中查找“root”单词
例9 使用 grep 查找文件中所有的空行
grep ^$ /etc/shadow #由于/etc/shadow文件中没有空行,所以没有任何输出
例10 使用 -i 参数忽略大小写
例11 使用 -e 参数查找多个模式,#也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。当然还可以使用-E通过扩展正则来表示
echo this is a text line | grep -e "is" -e "line" -o
is
is
line
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
echo this is a text line |grep -E "is|line" -o
-E {}前面要的内容如果是多个字符,要用()包裹起来,否则只会匹配{}前面相连的单一字符
例12 使用 -f 用文件指定待查找的模式
root@Linux:~# cat grep_file
^root
root
false$
root@Linux:~# grep -f grep_file /etc/passwd
例13 使用 -c 参数计算模式匹配到的数量
root@Linux:~# grep -cf file /etc/passwd #cf参数的顺序不能颠倒,file里定义要匹配的模式 2
例14 输出匹配指定模式行的前或者后面N行
a)使用-B参数输出匹配行的前4行 b)使用-A参数输出匹配行的后4行 c)使用-C参数输出匹配行的前后各4行
例15 -q 静默输出,用于测试
例16 打印样式匹配所位于的字符或字节偏移
echo gun is not unix | grep -bo "not" 7:not #一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。