linux上强大的字符串匹配工具详解-grep

1. grep 是什么

grep 是用于匹配输入数据中符合条件的字符串的工具,其匹配过程支持正则表达式,因而匹配能力非常强大。

grep 可以从文件或者标准输入设备中读取数据,若不指定任何文件名称,或是所给予的文件名为 -,则 grep 会从标准输入设备读取数据,否则从文件读取数据进行匹配。

2. 怎么用

grep 的命令格式如下:

 grep [option] pattern file [file2…]


3. 能匹配什么

我们先来看看 grep 能匹配什么,也就是 pattern 参数支持哪些形式。

3.1 普通全匹配

这也是最普通的字符串匹配了,直接匹配 pattern 所指的字符串。例如,

grep apple file.txt

#匹配结果如下,会直接列出匹配的行
apple
apple

3.2 正则表达式匹配

我们上面也说到了,grep强大的匹配能力就在于其支持正则表达式,下面我们来看看 grep 支持的正则表达式语法有哪些。

首先,grep 默认支持的是以下正则表达式。

位置限定匹配

  • 匹配行开头:^
grep ^a file.txt 

匹配a开头的行,注意是要该行的开头是a才会匹配。如果不是在开头出现,即使中间出现了也不会匹配该行。

  • 匹配行结尾:$
grep a$ file.txt

匹配a结尾的行,注意是要该行的结尾是a才会匹配。

  • 匹配单词开头:\<
grep '\<app' #匹配app开头的单词所在的行,例如apple,注意要有引号
  • 匹配单词结尾:\>
grep 'le\>' #匹配le结尾的单词所在的行,例如apple,注意要有引号
  • 单词锁定匹配:\b
grep '\bgrep\b'  #只匹配单词grep,例如不会匹配到grepa 

字符匹配

.       grep .a file.txt #匹配任意一个字符 例如 aa,ba等

[]      grep "[abc]c" file.txt #匹配[]里的任意一个字符,例如ac或者bc或者cc,注意加引号
        grep "[a-z]a" file.txt #匹配a-z间的26个字母任意一个字符,例如aa
    
[^]     grep "[^ab]a" #匹配除ab之外的任意一个字符,例如da
    
\w      grep "\w"  file.txt #匹配文字和数字字符,也就是[A-Za-z0-9]

\W      grep "\W"  file.txt #\w的反置形式,匹配一个或多个非单词字符,如点号句号等

次数限定匹配

*       grep "a*b" file.text   # *前面的字符重复0到多次,例如b,ab,aab

\{m\}   grep "x\{m\}" file.text  #重复字符x,m次,如:grep '0\{3\}'匹配包含3个0的行  

\{m,\}  grep "x\{m,\}" file.text #重复字符x,至少m次,如:'0\{5,\}'匹配至少有5个0的行

\{m,n\} grep "x\{m,n\}"  #重复字符x,至少m次,不多于n次,如:'0\{5,10\}'匹配5--10个0的行

拓展匹配模式

除了上面默认支持的模式之外,grep 还支持拓展匹配模式,拓展匹配模式要加参数 -E,支持的拓展匹配模式如下:

?       grep -E 'go?d' file.txt  #?匹配0个或1个在其之前的字符,例如这里匹配gd,god

+       grep -E 'go+d' file.txt #?匹配1个或多个在其之前的字符,例如这里匹配god,good等

()      grep -E 'g(oo)d' file.text #匹配括号里的字符串,一般都是和其他匹配模式一起使用,例如 grep -E 'g(oo)?d' file.text

|       grep -E 'god|good' file.txt #匹配被|分隔的多个字符串,例如此例匹配god或者good

注意点

  • 对于标准grep,如果在扩展元字符前面加\,grep会自动启用扩展选项-E。例如,
grep 'go\?d' file.txt
  • 当我们想要把上面的匹配模式所用到的字符当做普通字符来匹配,需要用到转义字符"\",不过如果这些特殊字符是位于"[]"当做的时候,大部分都会自动转义为普通字符了,除了"-"或者"^"等极少数字符以外。

4. option参数

了解了 grep 能匹配哪些数据之后,我们再来了解下 grep 可用的参数,grep 的参数主要用来影响查找的过程以及打印结果的。

4.1 影响查找过程

-a          将二进制文档以文本的方式来查找

-d <动作>     当指定要查找的含有目录(例如 grep apple ./*),必须使用这项参数,否则grep指令将回报信息并停止动作。其中动作支持,skip:跳过目录,recurse:递归读取目录的数据

-E          开启对拓展匹配模式的支持,如上面的例子

-f          指定匹配模式规则文件,其内容含有一个或多个匹配模式规则,格式为每行一个匹配模式规则。

-F          等同于fgrep命令,也就是fast grep,会把所有的字符都看作普通字符,也就是说正则表达式中的所有字符表示回其自身的字面意义,不再特殊。

-i          忽略字符大小写的差别

-r/-R       此参数的效果和指定"-d recurse"参数相同。

-w          单词匹配,等同于 "\<word\>"或者"\bword\b"

-y          忽略关键字符的大小写。(跟-i参数相同)

4.2 影响打印结果


-A <num>    除了显示符合模式的那一列之外,再显示该行之后num行的内容

-B <num>    除了显示符合模式的那一列之外,再显示该行之前num行的内容

-b          在匹配到行的开头标示该行的第一个字符前面总共多少byte数据

-color      以特定颜色高亮显示匹配关键字

-c          仅显示匹配行的总行数

-C <num>    除了匹配的那一行之外,并显示该行之前后各num行的内容,其中C是可以省略的,可以直接 grep -4 apple file.txt

-h          在显示匹配的那一行之前,不显示该行所属的文件名称(不加这个参数,匹配多个文件的时候会显示命中文件的名字)

-H          在显示匹配的那一行之前,表示该行所属的文件名称(不加这个参数,匹配单个文件的时候不会显示命中文件的名字)

-l          只显示命中的文件的名称

-L          只显示没命中的文件的名称

-n          显示命中的行所在的行数

-o          只显示匹配的部分,不显示该行其他的部分

-P          使用perl的正则表达式语法,因为perl的正则更加多元化,能实现更加复杂的场景。典型用法是匹配指定字符串之间的字符。(-e或-E是匹配扩展正则表达式,-P是匹配perl正则表达式)

-q          不显示任何信息

-s          不显示错误信息

-v          显示不包含匹配文本的所有行

-V          显示版本信息

-x          只显示整行都符合的列。

参考资料

https://zh.wikipedia.org/wiki/Grep#egrep%E5%92%8Cfgrep
https://www.runoob.com/linux/linux-comm-grep.html
https://www.cnblogs.com/kevingrace/p/9299232.html


Enjoy it !

如果觉得文章对你有用,可以赞助我喝杯咖啡~

版权声明

转载请注明作者和文章出处
作者: X先生
https://www.jianshu.com/p/218fb5d3934b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342