012、grep命令
本文最后更新于 66 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

grep命令

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,能使用正则表达式搜索文本,并把匹配的行打印出来。grep主要作用是过滤出指定的行,指定的行满足什么条件,满足的条件可配合正则表达式来表示,实现强大的文本处理。

grep格式
grep [option] pattern filename
grep的option选项说明
--color   显示颜色的参数,即搜索出来的关键字符带有颜色。使用"grep --color 关键字符" 或者 "grep --color=auto 关键字符"。一般配置别名alias grep="grep --color"
-a   不要忽略二进制数据。使用"grep -a 关键字符"
-A   显示符合关键字符的行, 以及其后面的n行。使用 "grep -An 关键字符" 或者 "grep -A n 关键字符"
-b   显示符合关键字符的行, 以及其前后的各n行。使用"grep -bn 关键字符", 注意这个不能使用"grep -b n 关键字符"! 跟-C参数差不多,但是会多打印出行号!!!
-B   显示符合关键字符的行, 以及其前面的n行。 使用 "grep -An 关键字符" 或者 "grep -A n 关键字符"
-c   只输出匹配行的计数。即只显示出匹配关键字符的那行的行数,不显示内容!使用"grep -c 关键字符"
-C   显示符合关键字符的行, 以及其前后的各n行。使用 "grep -Cn 关键字符" 或者 "grep -C n 关键字符"。跟-b参数差不多,-b参数会多打印行号出来!
-d   当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。-d后面跟的是进行的动作,一般是"grep -d read"或"grep -d recure",后面会有小示例说明。
-e   指定字符串作为查找文件内容的关键字符。使用"grep -e 关键字符"。grep -e "正则表达式" 文件
-E   将关键字符为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式!!通常用于满足多个条件中的其中一个条件进行搜索。使用grep -E "条件1|条件2|条件2"
-f   显示两个文件中相同的行。使用 "grep -f filename1 filename2 " 或者 "grep --file filename1 filename2",相等于"cat filename1 filename2|sort|uniq -d",即取交集!
-F   将关键字符视为固定字符串的列表。使用"grep -F 关键字 filename1" 或者 "grep -F 关键字符 filename1 filename2 filenamen", 会显示出来关键字所在的文件的列表。
-G   将关键字符视为普通的表示法来使用。
-h   对多文件搜索关键字符时不显示文件名,只显示关键字符。使用"grep -h 关键字符 filename1 filename2 filenamen", 不显示文件名,只显示关键字符。
-H   对多文件搜索关键字符时显示文件名和关键字符,跟-h参数相反。 使用"grep -H 关键字符 filename1 filename2 filenamen", 显示"文件名:关键字符"。
-i   忽略关键字符的大小写。(跟-y参数相同)。使用"grep -i"
-l   对多文件搜索关键字符时只显示文件名。使用"grep -l 关键字符 filename1 filename2 filenamen",只显示文件名,不显示关键字符。
-L   对多文件搜索关键字符时,只显示不匹配关键字符的文件名。使用"grep -L 关键字符 filename1 filename2 filenamen",只显示不匹配关键字符的文件。
-n   显示匹配关键字符的行号和行内容。使用"grep -n 关键字符 filename"
-q   不显示任何信息。用于if逻辑判断,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。
-R/-r   此参数的效果和指定"-d recurse"参数相同。
-s   当搜索关键字符,匹配的文件不存在时不显示错误信息。即不显示不存在或无匹配文本的错误信息。 使用"grep -s 关键字符 filename"
-v   反转或过滤搜索,即过滤出来那些不匹配关键字符的行。使用"grep -v 关键字符"
-w   精准搜索关键字符,即只显示完全匹配关键字符的行,不显示那些包含关键字符的行。使用"grep -w 关键字符", 或者使用grep "\<关键字符\>",或者使用grep "\b关键字符\b"
-x   只显示整行都是关键字符的行。使用"grep -x 关键字符"。
-y   忽略关键字符的大小写。(跟-i参数相同)。"grep -y"。
-o   只输出文件中匹配到的部分, 不会打印多余的内容。
-P   使用perl的正则表达式语法,因为perl的正则更加多元化,能实现更加复杂的场景。典型用法是匹配指定字符串之间的字符。(-e或-E是匹配扩展正则表达式,-P是匹配perl正则表达式)
grep正则表达式元字符集
^
匹配行的开始 如:'^grep'匹配所有以grep开头的行。
$
匹配行的结束 如:'grep$'匹配所有以grep结尾的行。
.
匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
*
匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[]
匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。即[mn]表示匹配m或者n关键字符,相当于grep -E "m|n"。注意[]里面不要放太多关键字符,容易混乱!只要放[]里面的都是要匹配的关键字符!
[^]
匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母,但是包含rep并且rep不在开头(即*req)的行。
\(..\)
标记匹配字符,如'\(love\)',love被标记为1。
\<
匹配单词的开始,如:'\
\>
匹配单词的结束,如'str\>'匹配包含以str结尾的单词的行。通常使用"\<关键字符\>"作为精准匹配,相当于grep -w
x\{m\}
重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w
匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W
\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b
单词锁定符,如: \byang\b 表示只匹配yang。相当于grep -w "yang" 或者 grep "\<yang\>"
+
匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。注意:先前字符必须使用()或[]括起来,并且使用grep -E。
?
匹配零个或一个先前的字符。如:'(gr)?p'匹配gr后跟一个或没有字符,然后是p的行。注意:先前字符必须使用()或[]括起来,并且使用grep -E。
a|b|c
匹配a或b或c。如grep -E "a|b|c", 匹配a或b或c中的任意一个都可以。grep -v "a\|b\|c" 或 egrep -v "a|b|c" 过滤掉a或b或c中的任意一个进行搜索。
()
分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
POSIX字符类 (注意使用的时候,外面要套一层中括号才能生效)
[:alnum:]
文字数字字符。使用 grep [[:alnum:]] filename 表示打印filename文件中包括数字和字母(大小写字母)的行

[:alpha:]
文字字符。使用 grep [[:alpha:]] filename 表示打印filename文件中包括字母(大小写字母)的行。

[:digit:]
数字字符。使用 grep [[:digit:]] filename 表示打印filename文件中包括数字的行。

[:graph:]
非空字符(非空格、控制字符)

[:lower:]
小写字符。使用 grep [[:lower:]] filename 表示打印filename文件中包括小写字母的行。

[:cntrl:]
控制字符

[:print:]
非空字符(包括空格)

[:punct:]
标点符号

[:space:]
所有空白字符(新行,空格,制表符)。例如使用 sed -i 's/[[:space:]]//g' filename 表示删除filename文件中所有的空格。

[:upper:]
大写字符。 使用 grep [[:upper:]] filename 表示打印filename文件中包括大写字母的行。

[:xdigit:]
十六进制数字(0-9,a-f,A-F)
grep同时筛选多个条件

grep使用-E参数实现"满足多个条件中的任意一个",如下:
1)满足任意条件(word1、word2和word3之一)将匹配。

grep -E "word1|word2|word3"  file.txt

grep要想实现"同时满足多个条件",需要执行多个grep过滤命令,如下:
2)必须同时满足三个条件(word1、word2和word3)才匹配。

grep word1 file.txt | grep word2 |grep word3

cat file.txt|grep word1 | grep word2 |grep word3
grep精确匹配关键字符

要想精确地搜索出文件中某个单词所在的行,而不是打印所有包括该单词字样的行,可以使用grep -w参数
-w(--word-regexp):表示强制PATTERN仅完全匹配字词

[root@uatdns01 ~]# cat /var/named/veredholdings.cn_zone|grep -w 172.16.50.24
wiki02      IN      A      172.16.50.24

或者使用 \<>单字边界也可以实现精确匹配(注意两边要加上双引号)

[root@uatdns01 named]# cat /var/named/veredholdings.cn_zone|grep "\<172.16.50.24\>"
wiki02      IN     A       172.16.50.24

或者使用单词锁定符\b也可以实现精确匹配

[root@uatdns01 named]# cat /var/named/veredholdings.cn_zone|grep "\b172.16.50.24\b"
wiki02      IN     A       172.16.50.24
grep高效搜索用法大全

下面以/opt/aa.txt文件搜索为例

[root@ss-server ~]# cat /opt/aa.txt
beijing
beihai
this is test
you are good

通过管道过滤ls -l输出的内容,只显示以a开头的行。

[root@ss-server ~]# ls -l | grep '^a'

显示所有以d开头的文件中包含test的行。

[root@ss-server ~]# grep 'test' d*

显示在aa,bb,cc文件中匹配test的行。

[root@ss-server ~]# grep 'test' aa bb cc

显示aa文件中所有包含每个字符串至少有5个连续小写字符的字符串的行。

[root@ss-server ~]# grep '[a-z]\{5\}' aa 

能够使用-o仅仅打印匹配的字符

[root@ss-server ~]# echo this is line. |grep -o "[a-z]*.$"
line.
[root@ss-server ~]# echo this is line. |grep -o "[a-z]*\."
line.
[root@ss-server ~]# grep -o "bei" /opt/aa.txt
bei
bei

打印除匹配行之外的其它行,使用-v:

[root@ss-server ~]# echo -e "1\n2\n3\n4"|grep -v "1\|2\|3"
4
[root@ss-server ~]# grep -v "beihai\|this is test" /opt/aa.txt
beijing
you are good

统计匹配字符串的行数。使用-c

[root@ss-server ~]# echo -e "1\n2\n3\n4"|grep -v "1\|2" -c
2

统计字符串模式匹配的次数。能够结合-o。

[root@ss-server ~]# echo "beijing is good"|grep -o "bei"
bei
[root@ss-server ~]# echo "beijing is good"|grep -o "i"
i
i
i

假设须要显示行号,能够打开-n

[root@ss-server ~]# cat /opt/aa.txt |grep -o "bei" -n
1:bei
2:bei

-b选项能够打印出匹配的字符串想对于其所在的行起始位置的偏移量(从0开始)。通常配合-o使用:

[root@ss-server ~]# echo "012333456789" | grep -b -o 4
6:4
[root@ss-server ~]# echo "beijing ai ni"|grep -o "ai" -b
8:ai
[root@ss-server ~]# echo "beijing ai ni"|grep -o "jing" -b
3:jing

-P参数(声明grep后面要用的是perl的正则表达式)(\d+ 一个或多个数字)

[root@ss-server ~]# echo -e "\nline.123\nline."|grep -P "[a-z]*\.\d+"
line.123
[root@ss-server ~]# echo -e "\nline.123\nline."|grep -P "[a-z]*\."
line.123
line.
[root@ss-server ~]# echo -e "\nline.123\nline."|grep -P "[a-z]*\.$"
line.
[root@ss-server ~]# echo -e "\nline.123\nline."|grep -P "\.$"
line.

匹配多个字符串模式(grep -e 或者 grep -E):
没有-o参数不会只打印匹配项
添加-o参数之后只打印匹配项

[root@ss-server ~]# cat /opt/aa.txt |grep -e "bei" -e "jing" -e "test"
beijing
beihai
this is test
[root@ss-server ~]# cat /opt/aa.txt |grep -e "bei" -e "jing" -e "test" -o
bei
jing
bei
test
[root@ss-server ~]# grep -E "bei|jing|test" /opt/aa.txt
beijing
beihai
this is test
[root@ss-server ~]# grep -E "bei|jing|test" -o /opt/aa.txt
bei
jing
bei
test

参数oP一起使用,会单独打印出要匹配的数字

[root@ss-server ~]# echo office365 | grep -oP "\d+"
365
[root@ss-server ~]# echo office365 | grep -oP "\d*"
365
[root@ss-server ~]# echo office365 | grep -oP "[0-9]*"
365
[root@ss-server ~]# echo 365beijing23 | grep -oP "\d+"
365
23
[root@ss-server ~]# echo 365beijing23 | grep -oP "\d*"
365
23
[root@ss-server ~]# echo 365beijing23 | grep -oP "[0-9]*"
365
23

只有参数-P,会完整显示匹配内容的一行,匹配内容高亮显示

[root@ss-server ~]# echo office365 | grep -P "\d+"
office365

只有参数-o,不会匹配任何内容,因为没有声明grep要使用正则表达式
如果单独使用参数-o,后面匹配的要是一个具体的字符串,不是正则

[root@ss-server ~]# echo office365 | grep -o "\d+"
[root@ss-server ~]#
[root@ss-server ~]# echo office365 | grep -o "365"
365

-Z选项在输出匹配文件名称时将以/0结尾配合xargs -0能够发挥非常多作用。
如下,将当前路径下包括wang字符串的文件全部删除

[root@ss-server ~]# echo "wang" >>11.txt
[root@ss-server ~]# echo "wangbo" >>12.txt
[root@ss-server ~]# echo "wanghu" >>13.txt
[root@ss-server ~]# echo "liru" >>14.txt
[root@ss-server ~]# grep -lZ "wang" *
11.txt 12.txt 13.txt
[root@ss-server ~]# grep -lZ "wang" *|xargs -0 rm
[root@ss-server ~]# ls
14.txt

限定全字匹配选项:-w,即精准匹配,三种方法:-w参数,"\<>"单字边界,"\b\b"

[root@ss-server ~]# echo "linux" >> aa.list
[root@ss-server ~]# echo "li" >> bb.list
[root@ss-server ~]# grep -rn "li" *.list
aa.list:1:linux
bb.list:1:li
[root@ss-server ~]# grep -w "li" *.list 
bb.list:li
[root@ss-server ~]# grep "\<li\>" *.list
bb.list:li
[root@ss-server ~]# grep "\bli\b" *.list 
bb.list:li

"grep -E" 和 egrep 效果等同

[root@ss-server ~]# cat /etc/passwd|grep -E "linan|bobo"
linan:x:1000:1000::/home/linan:/bin/bash
bobo:x:1002:1002::/home/bobo:/bin/bash

[root@ss-server ~]# cat /etc/passwd|egrep "linan|bobo"
linan:x:1000:1000::/home/linan:/bin/bash
bobo:x:1002:1002::/home/bobo:/bin/bash

"grep -e"参数同样是匹配多个关键字
[root@ss-server ~]# cat /etc/passwd|grep -e "linan" -e "bobo"
linan:x:1000:1000::/home/linan:/bin/bash
bobo:x:1002:1002::/home/bobo:/bin/bash

grep -q : 安静模式,不打印任何标准输出。用于if逻辑判断,如果有匹配的内容则立即返回状态值0。

[root@localhost ~]# cat test.txt
 17:41:54 up 67 days, 5 min,  2 users,  load average: 0.00, 0.01, 0.05
[root@localhost ~]# grep -q "days" test.txt
[root@localhost ~]# echo $?
0
[root@localhost ~]# grep -q "days111" test.txt
[root@localhost ~]# echo $?
1

[root@localhost ~]# grep -q "days" test.txt && echo ok
ok
[root@localhost ~]# grep -q "days111" test.txt && echo ok
[root@localhost ~]# grep -q "days" test.txt || echo ok   
[root@localhost ~]# grep -q "days111" test.txt || echo ok
ok

"grep -i" 或 "grep -y" 不区分大小写

[root@localhost ~]# echo -e "a\nA\nb\nc"|grep -i "a"
a
A
[root@localhost ~]# echo -e "a\nA\nb\nc"|grep -y "a"
a
A

grep使用正则关键匹配

[root@localhost ~]# cat test.txt
abc
adb123
abcde
abcdefg
[root@localhost ~]# cat test.txt|grep -e '[a-z]\{4\}'
abcde
abcdefg
[root@localhost ~]# cat test.txt|grep -e '[a-z]\{5\}'
abcde
abcdefg
[root@localhost ~]# cat test.txt|grep -e '[a-z]\{6\}'
abcdefg

grep查找以ab开头的行(使用^)

[root@localhost ~]# grep "^ab" test.txt

grep查找以de结尾的行(使用$)

[root@localhost ~]# grep "de$" test.txt

grep查找空行(使用^$);查找空行及其行号

[root@localhost ~]# grep "^$" test.txt
[root@localhost ~]# grep -n "^$" test.txt

grep利用[]搜索集合字符
[] 表示其中的某一个字符 ,例如[ade] 表示a或d或e

[root@localhost ~]# cat test.txt
abc
adb8877
123456
[root@localhost ~]# cat test.txt|grep [8]
adb8877
[root@localhost ~]# cat test.txt|grep [a8]
abc
adb8877
[root@localhost ~]# cat test.txt|grep [85]
adb8877
123456

可以用^符号做[]内的前缀,表示除[]内的字符之外的字 符。
比如搜索oo前没有g的字符串所在的行, 使用 '[^g]oo' 作搜索字符串

[root@localhost ~]# cat haha.txt
abc
cbc
3bc
[root@localhost ~]# cat haha.txt|grep "[^a]bc"
cbc
3bc

[] 内可以用范围表示,比如[a-z] 表示小写字母,[0-9] 表示0~9的数字, [A-Z] 则是大写字母们。
[a-zA-Z0-9]表示所有数字与英文字符。 当然也可以配合^来排除字符。
^ 表示行的开头,$表示行的结尾( 不是字符,是位置)那么'^$'就表示空行, 因为只有行首和行尾。
注意: ^和$放在[]括号内或[]括号外都可以!!!

[root@localhost ~]# grep [0-9] test.txt         #搜索包含数字的行
[root@localhost ~]# grep [a-z] test.txt         #搜索包含小写字母的行
[root@localhost ~]# grep [a-z0-9] test.txt      #搜索包含数字和小写字母的行
[root@localhost ~]# grep [A-Z] test.txt         #搜索包含大写字母的行
[root@localhost ~]# grep '^[a-z]' test.txt      #搜索以小写字母开头的行。或者 grep '[^a-z]' test.txt
[root@localhost ~]# grep '^[^a-zA-Z]' test.txt  #搜索开头不是英文字母的行
[root@localhost ~]# grep '\.$' test.txt         #搜索末尾是.的行。由于.是正则表达式的特殊符号,所以要用\转义

注意:在windows系统下生成的文本文件,换行会加上一个 ^M 字符。所以最后的字符会是隐藏的^M , 故在linux里处理Windows下面的文本时要特别注意!
可以用下面命令来删除^M符号。 ^M==\r

cat dos_file | tr -d '\r' > unix_file
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇