linux grep命令详解

grep常用用法

支持的正则 描述

-E,--extended-regexp 模式是扩展正则表达式(ERE)

-P,--perl-regexp 模式是 Perl 正则表达式

-e,--regexp=PATTERN 使用模式匹配,可指定多个模式匹

-f,--file=FILE 从文件每一行获取匹配模式

-i,--ignore-case 忽略大小写

-w,--word-regexp 模式匹配整个单词

-x,--line-regexp 模式匹配整行

-v,--invert-match 打印不匹配的行

输出控制 描述

-m,--max-count=NUM 输出匹配的结果 num 数

-n,--line-number 打印行号

-H,--with-filename 打印每个匹配的文件名

-h,--no-filename 不输出文件名

-o,--only-matching 只打印匹配的内容

-q,--quiet 不输出正常信息

-s, --no-messages 不输出错误信息

-r,--recursive 递归目录

-c,--count 只打印每个文件匹配的行数

--include=FILE_PATTERN   只检索匹配的文件

--exclude=FILE_PATTERN   跳过匹配的文件

--exclude-from=FILE       跳过匹配的文件,来自文件模式

--exclude-dir=PATTERN     跳过匹配的目录

内容行控制 描述

-B,--before-context=NUM 打印匹配的前几行

-A,--after-context=NUM 打印匹配的后几行

-C,--context=NUM 打印匹配的前后几行

--color[=WHEN], 匹配的字体颜色

 

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!

 你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可喔! 这样每次运行 grep 他都会自动帮你加上颜色显示啦

 

将/etc/passwd,将没有出现 root 的行取出来

# grep -v root /etc/passwd 

 

用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示:

[root@www ~]# dmesg | grep -n --color=auto 'eth'  #列出行号,+颜色

[root@www ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth' #前两行及后三行也都被显示出来,-C3表示前后3行

 

根据文件内容递归查找目录

# grep ‘energywise’ *           #在当前目录搜索带'energywise'行的文件

# grep -r ‘energywise’ *        #在当前目录及其子目录下搜索'energywise'行的文件
# grep -l -r ‘energywise’ *     #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件

这几个命令很使用,是查找文件的利器。

 

grep与正规表达式

 字符类

[root@www ~]# grep -n 't[ae]st' regular_express.txt 8:I can't finish the test. 9:Oh! The soup taste good. #test 或 tast

[root@www ~]# grep -n '[^g]oo' regular_express.txt   #取反

[root@www ~]# grep -n '[^a-z0-9]oo' regular_express.txt  #[a-zA-Z0-9]。

 

行首与行尾字节 ^ $
[root@www ~]# grep -n '^the' regular_express.txt

[root@www ~]# grep -n '^[a-z]' regular_express.txt

[root@www ~]# grep -n '^[^a-zA-Z]' regular_express.txt  #不想要开头是英文字母

[root@www ~]# grep -n '\.$' regular_express.txt #转义字符(\)来加以解除小数点的特殊含义

[root@www ~]# grep -n '^$' regular_express.txt  #找出空白行

 

任意一个字节 . 与重复字节 *
这两个符号在正则表达式的意义如下:

. (小数点):代表『一定有一个任意字节』的意思;
* (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态

[root@www ~]# grep -n 'g..d' regular_express.txt 

[root@www ~]# grep -n 'ooo*' regular_express.txt 

[root@www ~]# grep -n 'goo*g' regular_express.txt 

[root@www ~]# grep -n 'g.*g' regular_express.txt
[root@www ~]# grep -n '[0-9][0-9]*' regular_express.txt

 

限定连续 RE 字符范围 {}

[root@www ~]# grep -n 'o\{2\}' regular_express.txt
[root@www ~]# grep -n 'go\{2,5\}g' regular_express.txt
[root@www ~]# grep -n 'go\{2,\}g' regular_express.txt

扩展grep(grep -E 或者 egrep):
使用扩展grep的主要好处是增加了额外的正则表达式元字符集。

打印所有包含NW或EA的行。如果不是使用egrep,而是grep,将不会有结果查出。

    # egrep 'NW|EA' testfile     
    northwest       NW      Charles Main        3.0     .98     3       34
    eastern         EA      TB Savage           4.4     .84     5       20

对于标准grep,如果在扩展元字符前面加\,grep会自动启用扩展选项-E。

#grep 'NW\|EA' testfile
northwest       NW      Charles Main        3.0     .98     3       34
eastern         EA      TB Savage           4.4     .84     5       20

 

搜索所有包含一个或多个3的行。

# egrep '3+' testfile
# grep -E '3+' testfile
# grep '3\+' testfile        

 

搜索所有包含0个或1个小数点字符的行。
    

# egrep '2\.?[0-9]' testfile

# grep -E '2\.?[0-9]' testfile

# grep '2\.\?[0-9]' testfile

 

搜索一个或者多个连续的no的行。

# egrep '(no)+' testfile
# grep -E '(no)+' testfile
# grep '\(no\)\+' testfile   #3个命令返回相同结果,
northwest       NW      Charles Main        3.0     .98     3       34
northeast       NE       AM Main Jr.        5.1     .94     3       13
north           NO      Margot Weber        4.5     .89     5       9

不使用正则表达式

fgrep 查询速度比grep命令快,但是不够灵活:它只能找固定的文本,而不是规则表达式。

如果你想在一个文件或者输出中找到包含星号字符的行

fgrep  '*' /etc/profile

或
grep -F '*' /etc/profile

 

示例:

1)输出 b 文件中在 a 文件相同的行

# grep -f a b

2)输出 b 文件中在 a 文件不同的行

# grep -v -f a b

3) 匹配多个模式

# echo "a bc de" |xargs -n1 |grep -e 'a' -e 'bc

a

bc

4)去除空格 http.conf 文件空行或开头#号的行

# grep -E -v "^$|^#" /etc/httpd/conf/httpd.conf

5) 匹配开头不分大小写的单词

# echo "A a b c" |xargs -n1 |grep -i a

# echo "A a b c" |xargs -n1 |grep '[Aa]'

A

a

6)只显示匹配的字符串

# echo "this is a test" |grep -o 'is'

is

is

7)输出匹配的前五个结果

# seq 1 20 |grep -m 5 -E '[0-9]{2}'

10

11

12

13

14

8)统计匹配多少行

# seq 1 20 |grep -c -E '[0-9]{2}'

11

9) 匹配 b 字符开头的行

# echo "a bc de" |xargs -n1 |grep '^b'

bc

10) 匹配 de 字符结尾的行并输出匹配的行

# echo "a ab abc abcd abcde" |xargs -n1 |grep -n 'de$'

5:abcde

11) 递归搜索/etc 目录下包含 ip 的 conf 后缀文件

# grep -r '192.167.1.1' /etc --include *.conf

12) 排除搜索 bak 后缀的文件

# grep -r '192.167.1.1' /opt --exclude *.bak

13) 排除来自 file 中的文件

# grep -r '192.167.1.1' /opt --exclude-from file

14) 匹配 41 或 42 的数字

# seq 41 45 |grep -E '4[12]'

41

42

15) 匹配至少 2 个字符

# seq 13 |grep -E '[0-9]{2}'

10

11

12

13

16) 匹配至少 2 个字符的单词,最多 3 个字符的单词

# echo "a ab abc abcd abcde" |xargs -n1 |grep -E -w -o '[a-z]{2,3}'

ab

abc

17) 匹配所有 IP

# ifconfig |grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

18) 打印匹配结果及后 3 行

# seq 1 10 |grep 5 -A 3

5

6

7

8

19) 打印匹配结果及前 3 行

# seq 1 10 |grep 5 -B 3

2

3

4

5

20) 打印匹配结果及前后 3 行

# seq 1 10 |grep 5 -C 3

2

3

4

5

6

7

8

不显示输出

不显示错误输出:

# grep 'a' abc

grep: abc: No such file or directory

# grep -s 'a' abc

# echo $?

2

不显示正常输出,可以通过$?判断结果:

# grep -q 'a' a.txt


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值