在文本中搜索是文本处理中一项重要的用例,如何从上千行的文件之中查找到所需要的数据

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

发表评论

邮箱地址不会被公开。 必填项已用*标注