在文本中搜索是文本处理中一项重要的用例,如何从上千行的文件之中查找到所需要的数据
grep命令是UNIX中用于文本搜索的大师级工具,可以接受正则表达式和通配符,可以使用grep命令选项来生成各种格式的输出
我们在文件中搜索一个单词
grep match_pattern filename
这样会返回包含 match_pattern的文本行
也可以像下面这样从stdin中读取
echo -e “this is a word\nnext line” |grep word
grep也可以从多个文件中获取
grep “text” file1 file2
可以用–color在输出中重点标记处匹配的淡出
grep word filename –color=auto
grep可以使用正则表达式
需要添加-E的选项
或者是使用默认支持正则表达式的grep-egrep
grep -E “[a-z]+”
egrep “[a-z]+”
我们只输出匹配到的文本部分,可以使用选项 -o
如果想要翻转打印
grep -v match_pattern file
统计文件中包含匹配字符串的行数
grep -c “text” filename
10
-c只是统计的匹配行的数量,不是匹配次数
为了统计一个文件中匹配项的数量,可以如下的统计
打印出包含匹配字符串的行数
grep linux -n sample1.txt
打印样式匹配所位于的字符或者字节偏移
echo gnu is not unix | grep -b -o “not”
上面的字符偏移是7,说明是这一行的第7个字符
选项 -b -o经常配合使用
搜索多个文件并且找到匹配的文本唯一哪一个文件内
grep -l linux sample1.txt sample2.txt
递归搜索文件
在多级目录中对文本进行递归搜索,可以使用
grep “text” . -R -n
忽略样式中的大小写
选项 -i 可以使得匹配样式不考虑字符的大小写
echo hello word |grep -i “HELLO”
使用grep匹配多个样式
指定一个样式,然而,使用选项-e来指定多个匹配样式
grep -e “pattern1” -e “pattern”
在grep搜索中包括或者排除文件
grep “main()” .-r –include *.{c,cpp}
这样,就可以包含所有的.c .cpp文件
grep “main()” . -r –exclude “README”
排除了README文件
使用xargs,可以将文件名列表作为命令行,当文件列结束的时候,亦是终结之时
而且应该使用0字节作为文件终止符,而不是空格,可以避免单个文件名被拆分为多个文件名
New file.txt被解析为New和file.txt两个文件名,而这个问题完全可以利用0值的字节后缀来避免,我们使用xargs来使得grep这类命令接收stdin文本
grep “test” file* -lZ | xargs -0 rm
-Z选项来指定指定终结符\0,xargs -0读取输入并且用0来分割文件名
grep的静默输出
-q 可以实现静默输出,这样不会进行任何的输出,只是进行运行命令,然后根据命令执行成功与否退出状态
这样,运行成功返回0,失败返回非0值
打印出匹配的文本前后的行
基于上下文的打印是grep的特色,假设已经找到了给定文本的匹配行,通常grep只会打印这一行,如果需要前后的n行,那么也能做到
打印某个结果后的3行,使用-A的选项
seq 10 | grep 5 -A 3
某个结果之前的3行 使用-B的选项
seq 10 | grep 5 -B 3
要打印前后的几行,可以使用-C的选项
seq 10 | grep 5 -C 3