本文阅读量 次
grep 命令用法¶
概述¶
示例数据¶
Hello, grep
this is demo paragraph-1
this is demo paragraph-1
this is demo paragraph-1
this is demo paragraph-1
this is demo paragraph-1
that is another section-2
that is another section-6
footer-1
footer-2
常见场景¶
如何进行反向匹配¶
使用 -v
选项进行反向匹配,即去掉匹配中的内容,保留剩下部分
-v
取自于 reverse
单词
grep -v demo | grep -v
如何去掉多个不想要的匹配记录¶
使用 -v
加 管道|
,即通过多次匹配来去掉不想要的内容
grep -v demo | grep -v footer
如何匹配去掉空行¶
grep -v "^\s*$"
如何同时匹配多个表达式(或的关系)¶
可以使用多个 -e
指定匹配到任意一个表达式即可
grep -e demo -e section
如何打印出匹配前后的一些指定内容¶
有时候我们不仅关注匹配到的内容,还想知道匹配到的地方前后都发生了什么,即想知道匹配发生上下文,该如何来做呢?
可以通过打印匹配行前后指定行来实现
打印出 foo 前 30 行,后 20 行数据, -A: --after
, -B: --before
grep foo -A 20 -B 30
如何打印一行中的指定个数的字符¶
有时候一行内容特别多,尤其是 web 压缩后,可能所有文件都是一行,这是仅需要打印出目标字串前后的固定个数的字符即可
grep -r -E -o ".{0,10}wantedText.{0,10}" *
- -o: 仅打印匹配到字串部分
参考 https://unix.stackexchange.com/questions/163726/limit-grep-context-to-n-characters-on-line ⧉
关于贪婪匹配¶
grep 默认使用的是 贪婪匹配
, 即 .*
尽可能多匹配或匹配最长的部分;
grep -R "metadata\[[\"'].*[\"']\]" -o .
如上命令,匹配结果如下
metadata['retrieval_query']
metadata['title']
metadata['file_name']
metadata['file_url'] = doc.metadata['source'] => 此行就是贪婪匹配多匹配出来的
metadata['embed_version']
metadata['score']
metadata['file_id']
使用 -P
指定按照 Perl 正则规则进行匹配,且在 .*
后增加 ?
限定使用 非贪婪匹配
grep -R -P "metadata\[[\"'].*?[\"']\]" -o .
非贪婪匹配结果如下
metadata['retrieval_query']
metadata['title']
metadata['file_name']
metadata['file_url'] => 非贪婪匹配
metadata['source']
metadata['embed_version']
metadata['score']
metadata['file_id']
Note
非贪婪匹配 .*?
在 -E
(egrep) 模式下不起作用