shell三剑客之一:grep详解

一、简介

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

1
2
fgrep == grep -F
egrep == grep -E

二、格式

grep [OPTIONS] PATTERN [FILE...]

三、主要参数

grep 如果不加参数的话,则是会使用==普通的正则的表达式==进行匹配。

[options]主要参数:

  • 帮助信息

    1
    2
    -V  --version,显示版本
    --help 显示帮忙信息
  • 模式选择

1
2
3
4
5
6
7
8
9
10
11
-G  --basic-regexp
普通的正则的表达式进行匹配,这是默认选项,可省略

-E --extended-regexp
等同于egrep,可以使用扩展的正则表达式来匹配

-P --perl-regexp
使用Perl正则表达式匹配,一般不使用

-F --fixed-strings
视为字符串进行匹配,如果字符串出现了.*,也认为为普通的字符串,即不使用正则表达式进行匹配
  • 匹配控制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    -e pattern 
    --regexp=pattern
    多条件匹配
    -f file
    --file=file
    指定文件进行多条件匹配,一行为一个条件
    -i/-y
    --ignore-case
    不区分大小写
    -v
    --invert-match
    不显示包含匹配字符的所有行
    -w
    --word-regexp
    只匹配整个单词,而不是字符串的一部分
    -x
    --line-regexp
    只显示整行都匹配
  • 一般输出控制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    -c  --count
    只输出匹配行的计数
    --color
    将查找到的子符以有颜色的输出
    -q --quiet/--silent
    匹配字符不显示任何信息,如果有匹配到,返回状态码0;没有匹配则返回状态码为非0
    -s --no-messages
    不显示不存在或无匹配文本的错误信息。在第七版unix的系统下等同于-q,所以此参数建议不在要shell中使用
    -o --only-matching
    只输出文件中匹配到的部分
    -l --files-with-matches
    查询多文件时只输出包含匹配字符的文件名

    -L --files-without-match
    查询多文件时只输出不包含匹配字符的文件名
  • 输出行前缀控制

    1
    2
    3
    4
    5
    6
    7
    8
    -b --byte-offset
    打印样式匹配所位于的字符或字节偏移,选项 -b -o 一般总是配合使用。并没有什么用处
    -H --with-filename
    查询多文件时会显示文件名,这是默认的选项
    -h --no-filename
    查询多文件时不显示文件名
    -n --line-number
    显示匹配行及行号
  • 上下文控制

1
2
3
4
5
6
7
8
9
10
11
12
13
-A num
--after-context=num
除了显示符合范本样式的那一行之外,并显示该行之后的内容
-B num
--before-context=num
除了显示符合范本样式的那一行之外,并显示该行之前的内容
-C num
--context=num
匹配的上下文分别显示[number]行
--group-separator=string
如果查找的内容是多个结果,且又使用-A -B -C这三个参数之后,使用string来代替分隔,默认为--为分隔符
--no-group-separator
不输出分隔符
  • 文件和目录控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-a  --text,此用法等同于--binary-files=text
将 binary 文件以 text 文件的方式搜寻数据,此方法要配合zgrep来查询压缩包的字符
-I 等同于--binary-files=without-match

-r --recursive,等同于-directories=recurse
递归查询目录下的所有子目录以及文件,不包括符号链接
-R --dereference-recursive
同-r,但其查询时,会查询符号链接
-d --directories=action
默认的action为read,还有一个action为recurse,这个就等同于-r
--binary-files=type
type为以下类型:
1、默认为binary
2、without-match,等同于-I
3、text,等同于-a
--exclude=glob
排除一些目录或者文件,不进行匹配
--exclude-from=file
以文件形式排除
--exclude-dir=glob
跳过目录
--include=glob
简单理解为在哪些文件下查询

三、实例

  • -o 只显示匹配到的数据
1
2
3
4
5
[op@PSR-17208 network-scripts]$ grep eth.* ifcfg-eth0
DEVICE=eth0

[op@PSR-17208 network-scripts]$ grep -o eth.* ifcfg-eth0
eth0
  • -a 配合zgrep来使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[op@PSR-17208 network-scripts]$ tar zcvf /tmp/ifcfg.tgz ifcfg-*
ifcfg-eth0
ifcfg-eth0:317
ifcfg-eth1
ifcfg-eth2
ifcfg-eth3
ifcfg-lo
[op@PSR-17208 network-scripts]$ grep IPADDR /tmp/ifcfg.tgz
[op@PSR-17208 network-scripts]$ grep -a IPADDR /tmp/ifcfg.tgz
#以上方法都匹配不到数据
[op@PSR-17208 network-scripts]$ zgrep -a IPADDR /tmp/ifcfg.tgz
IPADDR=218.75.158.52
IPADDR=198.19.5.150
IPADDR=111.23.5.150
IPADDR=127.0.0.1
  • -F 使用普通字符串来查看

    1
    2
    3
    [op@PSR-17208 network-scripts]$ echo "1.1.1.1" |fgrep '1.*'
    [op@PSR-17208 network-scripts]$ echo "1.1.1.1" |grep '1.*'
    1.1.1.1
  • -A 显示匹配后 -B显示匹配前的数据 -C 显示前后行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[op@PSR-17208 network-scripts]$ grep -n GATEWAY -A2 -B1 ifcfg-eth0
3-NETMASK=255.255.255.128
4:GATEWAY=218.75.158.2
5-BOOTPROTO=static
6-ONBOOT=yes

[op@PSR-17208 network-scripts]$ grep -n GATEWAY -C 1 ifcfg-eth0
3-NETMASK=255.255.255.128
4:GATEWAY=218.75.158.2
5-BOOTPROTO=static

[op@11009815 network-scripts]$ dmidecode |grep -C 1 --group-separator='-------------' Product
Manufacturer: Dell Inc.
Product Name: PowerEdge R710
Version: Not Specified
-------------
Manufacturer: Dell Inc.
Product Name: 0XDX06
Version: A09
  • -e 指定多个匹配条件;可以参数-E;-f 将匹配条件放在文件下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [op@PSR-17208 network-scripts]$ cat /tmp/a.txt 
    GATEWAY
    NETMASK
    [op@PSR-17208 network-scripts]$ grep -f /tmp/a.txt ifcfg-eth0
    NETMASK=255.255.255.128
    GATEWAY=218.75.158.2
    [op@PSR-17208 network-scripts]$ grep -e -f /tmp/a.txt ifcfg-eth0

    [op@PSR-17208 network-scripts]$ grep -e GATEWAY -e NETMASK ifcfg-eth0
    NETMASK=255.255.255.128
    GATEWAY=218.75.158.2
  • -w 只显示全字符合的列 -x 只显示全列符合的列

1
2
3
4
5
6
7
[op@PSR-17208 network-scripts]$ grep -w GATEWA ifcfg-eth0
[op@PSR-17208 network-scripts]$ grep -w GATEWAY ifcfg-eth0
GATEWAY=218.75.158.2

[op@PSR-17208 network-scripts]$ grep -x GATEWAY ifcfg-eth0
[op@PSR-17208 network-scripts]$ grep -x GATEWAY=218.75.158.2 ifcfg-eth0
GATEWAY=218.75.158.2
  • -r/-R 递归查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#在包涵的目录下查询
[op@11009815 network-scripts]$ grep -n DEVICE . -R --include "ifcfg-eth*" --include "ifcfg-bond*"
./ifcfg-eth3:9:DEVICE=eth3
./ifcfg-bond0:1:DEVICE=bond0
./ifcfg-eth2:9:DEVICE=eth2
./ifcfg-bond0:317:1:DEVICE=bond0:317
./ifcfg-eth1:1:DEVICE=eth1
./ifcfg-eth0:1:DEVICE=eth0

# exclude 排除目录
[op@PSR-17208 network-scripts]$ grep -n BOOTPROTO . -R --exclude "ifup-aliases" --exclude "network-functions" --exclude "ifup-plusb" --exclude "ifdown-eth" --exclude "ifup-eth" --exclude "ifup"
./ifcfg-eth2:5:BOOTPROTO=static
./ifcfg-eth0:5:BOOTPROTO=static
./ifcfg-eth3:5:BOOTPROTO=static
./ifcfg-eth0:317:2:BOOTPROTO=static
./ifcfg-eth1:5:BOOTPROTO=none

参考资料

官方文档:http://www.gnu.org/software/grep/manual/grep.html

https://wenzhiquan.github.io/2016/09/06/2016-09-06-grep/

http://www.51niux.com/?id=90

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/script/shell-grep.html
  • 本文主题: shell三剑客之一:grep详解
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%