跳转至
本文阅读量

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) 模式下不起作用