Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> Linux 文章内容

linux grep命令-itarticl.cc-IT技术类文章记录&分享

发布时间: 9年前Linux 115人已围观返回

1.作用

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。


2.格式

grep [options]


3.主要参数

[options]主要参数:

-c:只输出匹配行的计数。

-I:不区分大 小写(只适用于单字符)。

-h:查询多文件时不显示文件名。

-l:查询多文件时只输出包含匹配字符的文件名。

-n:显示匹配行及 行号。

-s:不显示不存在或无匹配文本的错误信息。

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

pattern正则表达式主要参数:

\: 忽略正则表达式中特殊字符的原有含义。

^:匹配正则表达式的开始行。

$: 匹配正则表达式的结束行。

\<:从匹配正则表达 式的行开始。

\>:到匹配正则表达式的行结束。

[ ]:单个字符,如[A]即A符合要求 。

[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。

. :所有的单个字符。

.* :有字符,长度可以为0。


4. 用法举例

在grep搜索结果中包括或者排除指定文件:

#只在目录中所有的.php和.html文件中递归搜索字符"main()"

grep "main()" . -r --include *.{php,html}

#在搜索结果中排除所有README文件

grep "main()" . -r --exclude "README"

#在搜索结果中排除filelist文件列表里的文件

grep "main()" . -r --exclude-from filelist


grep静默输出:

grep -q "test" filename

#不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。


grep的option

$cat a.txt

a

bb

ccc

dddd

1a

2b

3d

4a

5a

-A 1 表示找到所有匹配行,并显示所有匹配行后的一行

在错误日志查找时还是很有用

$ grep -A 1 b a.txt

bb //找到b了

ccc //显示bb这一行的后面一行

--

2b

3d


-B 1 表示找到所有匹配行,并显示所有匹配行的前面一行

$ grep -B 1 b a.txt

a

bb //匹配到b了,把bb这一行到前一行也显示出来

--

1a

2b


-C 1表示找到所有匹配行,并显示所有匹配行的前一行,后一行

$ grep -C 1 b a.txt

a

bb //匹配到b了,把a,ccc前后一行也显示出来

ccc

--

--

1a

2b

3d


-a 表示把所有文件当作ASCII文件来处理 搜索二进制文件

//a.pcap是一个tcpdump生成的文件,为binary文件,使用grep不能搜索

$ grep "HOST" a.pcap

Binary file a.pcap matches

$ grep -a "HOST" a.pcap

HOST: 239.255.255.250:1900

HOST: 239.255.255.250:1900


-b 表示显示match的字符串在文件中的offset

$grep -b a a.txt

0:a

14:1a //表示这一行的a在文件中的offset为14

23:4a

26:5a


-c 显示有多少行match

$grep -c a a.tx

4


--color 是把match的字符用不同颜色标示出来

#grep --color a a.txt

a

1a

4a

5a


-e 后面跟一个正则表达式,指定多个正则表达式的时候很有用

$grep -e [a-c] -e [0-2] a.txt //匹配a,b,c 或者0,1,2

a

bb

ccc

1a

2b

4a

5a

2


-f可以指定pattern在我们的文件中 pattern文件中的每一行都会来进行匹配

$ cat pattern.txt

a

2

$ cat a.txt

a

bb

ccc

dddd

1a

2b

3d

4a

5a

2

$grep -f pattern.txt a.txt

a

1a

2b

4a

5a

2


-m 最多匹配几个后,就停止,这样速度会比较快

$ grep -m 2 a a.txt

a

1a


-n 匹配之后,在前面打印行号,这个还是有用的

$ grep -n a a.txt

1:a

5:1a

8:4a

9:5a


-o 只打印匹配的内容

$ grep -o a a.txt

a

a

a

a


-r 搜索子目录

$ll

total 208

-rw-r--r-- 1 * * 91868 5 1 23:05 a.pcap

-rw-r--r-- 1 * * 31 5 2 22:39 a.txt

-rw-r--r-- 1 * * 4 5 1 23:18 b.txt

drwxr-xr-x 3 * * 102 5 4 18:58 dir1 //这是一个目录

-rw-r--r-- 1 * * 4 5 4 18:49 pattern.txt

//只能搜索当前目录

$grep a *

Binary file a.pcap matches

a.txt:a

a.txt:1a

a.txt:4a

a.txt:5a

b.txt:aaa

grep: dir1: Is a directory //碰到一个目录了

pattern.txt:a

$grep -R a * //搜索子目录

Binary file a.pcap matches

a.txt:a

a.txt:1a

a.txt:4a

a.txt:5a

b.txt:aaa

dir1/b.txt:a //这个目录也找到了

pattern.txt:a


-v invert查找 下面为在a.txt中,查找不包含"a"的行 这个命令会经常使用

$ grep -v a a.txt

bb

ccc

dddd

2b

3d

2


-w 查找一个词,

#cat word.txt

it is a good day //分成五个词,分别是it , is, a, good, day

itis a goodday //分成三个词,分别是itis, a, goodday

$ grep -w it word.txt

it is a good day

$ grep -w good word.txt

it is a good day


grep 正则表达式

^pattern 表示开头处开始匹配

$echo "it is "|grep "^is" //因为is不在行的开始处,所以没有匹配上

$echo "it is "|grep "^i"

it is


pattern$ 从结尾处匹配

$ echo "it is "|grep "it$" //这个匹配不上

$ echo "it is "|grep "is$" //能匹配上

it is


. 为匹配任意单个字符

$ echo "it is" |grep "."

it is

$echo "it is" |grep "a."


".*" 匹配任意长度的任意字符

$ echo "it is" |grep ".*"

it is

$ echo "#" |grep ".*" //匹配任意字符,所以#也可以匹配

#

"r.*h"

//匹配一个字符串,其中有r,有h,且r在前,h在后,且r和h之间可以间隔任意长度的任意字符串,当然也可以没有间隔

$ echo "redhat" |grep "r.*h"

redhat

$ echo "rh" |grep "r.*h"

rh

$ echo "redhat" |grep "r.*b"

"^r.*h$"

//匹配一个字符串,其中r是第一个字符,h是最后一个字符,且r和h之间可以间隔任意长度的任意字符串,当然也可以没有间隔

$ echo "rh" |grep "^r.*h$"

rh

$ echo "redh" |grep "^r.*h$"

redh

$ echo "redhat" |grep "^r.*h$" //这里匹配不上


匹配指定范围内的任意字符 [e] 匹配任意单个字符

$ echo "redh" |grep "[e]"

redh

$ echo "redh" |grep "[s]"

匹配指定范围内的任意字符 [eh] 匹配e或h

$ echo "redh" |grep "[eh]"

redh

$ echo "redh" |grep "[sh]"

redh

匹配指定范围内的任意字符 [a-z],[1-3a-b] [1-3a-bX-Z]

$ echo "redh" |grep "[a-d]"

redh

$ echo "redh" |grep "[d-f]"

redh

$ echo "redh" |grep "[d-a]"

grep: invalid character range

$ echo "redh" |grep "[f-f]"

$ echo "redh" |grep "[a-z]"

redh

$ echo "redX" |grep "[x-x]"

$ echo "redX" |grep "[X-X]"

redX

$ echo "redX" |grep "[a-Z]"

grep: invalid character range

$ echo "redX" |grep "[x-X]" //不要欺负计算机

grep: invalid character range

$ echo "16" |grep "[1-2]"

16

$ echo "16" |grep "[5-8]"

16

$ echo "16" |grep "[1-9a-z]"

16

$ echo "b" |grep "[1-9a-z]"

b

$ echo "1xX" |grep "[1-1x-zX-X]"

1xX


//[^] 匹配指定范围外的字符

$ echo "1" |grep "[^1-3]" //匹配非[1-3]的,不能匹配上

$ echo "2" |grep "[^1-3]" //匹配非[1-3]的,不能匹配上

$ echo "3" |grep "[^1-3]" //匹配非[1-3]的,不能匹配上

$ echo "4" |grep "[^1-3]" //匹配非[1-3]的,能匹配上

4

$ echo "a" |grep "[^1-3]" //匹配非[1-3]的

a

$echo "a" |grep "[^1-3a-b]"

$echo "a" |grep "[^1-3a-b]" //匹配非[1-3],非[a-b]的 ,匹配不上

$echo "c" |grep "[^1-3a-b]" //匹配非[1-3],非[a-b]的 ,匹配不上

c

$echo "4" |grep "[^1-3a-b]" //匹配非[1-3],非[a-b]的 ,能匹配上

4


[[:space:]] 匹配空白字符

$ echo "a"|grep "[[:space:]]"

$ echo "a b"|grep "[[:space:]]"

a b


\? 表示匹配前面的字符串0次或1次

$ echo "z"|grep "z\(a\?\)"

z

$ echo "za"|grep "z\(a\?\)"

za

$ echo "ab"|grep "z\(a\?\)" //不匹配


{m,n} 匹配前面的字符串m到n次

$ echo "aa"|grep "a\{1,3\}" //匹配a,aa,aaa

aa

$ echo "aa"|grep "a\{2,3\}"

aa

$ echo "aa"|grep "a\{3,4\}" //不匹配

{2,} 匹配前面的字符串至少两次

$ echo "aa"|grep "a\{1,\}"

aa

$ echo "aa"|grep "a\{2,\}"

aa

$ echo "aa"|grep "a\{3,\}" //不匹配

// \<pattern1必须以pattern1开头 \pattern2> 必须以pattern2结尾

$ echo "redhat"|grep "\"

redhat

$ echo "redhat"|grep "\"

redhat

$ echo "zredhat"|grep "\" //不匹配

$ echo "redhat"|grep "\" //不匹配

$ echo "redhat"|grep "^r[a-z]*t$" //相当于这个

redhat


//() 用来进行分组, 下面这个就是匹配带有re和rea的

$ echo "redhat"|grep "\(re\)\(a\?\)"

redhat

$ echo "zedhat"|grep "\(re\)\(a\?\)" //匹配不上

\+ 表示匹配前面的字符串一次或多次

$ echo "zredhat"|grep "\(re\)\(d\+\)" //匹配red,redd,reddd,redddd,...

zredhat

$ echo "zrehat"|grep "\(re\)\(d\+\)" //匹配不上

\| 表示或的关系

$ echo "d"|grep "\(re\)\|\(d\+\)" //匹配re 或者d,dd,ddd..

d

$ echo "re"|grep "\(re\)\|\(d\+\)"

re

$ echo "a"|grep "\(re\)\|\(d\+\)" //没有匹配上


$ grep ‘w\(es\)t.*\1′ aa

如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。


发布时间: 9年前Linux115人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    114人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流