grep 命令的功能是过滤制定规则的信息。

冷知识:grep的名字来源于一个sed格式:g/re/p  g:所有行,re:正则规则,p:打印

sed 的详细介绍以后我会写,这是一大块知识点,需要花一些时间来梳理。sed也算是 shell 中的神器了

用法:

grep [OPTION...] PATTERNS [FILE...]

grep [OPTION...] -e PATTERNS ... [FILE...]

grep [OPTION...] -f PATTERN_FILE ... [FILE...]

选项:

通用选项:

--help                帮助文档

-V, --version      版本信息

匹配器选项:

-E, --extended-regexp        扩展正则

-F, --fixed-strings                固定字符串,不是正则

-G, --basic-regexp              基础正则,默认选项

-P, --perl-regexp                 perl 兼容的正则

匹配控制选项:

-e PATTERNS, -regexp=PATTERNS        指定正则风格

-f FILE, --file=FILE        从 FILE 指定正则风格

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

-v, --invert-match        反向匹配

-w, --word-regexp        字符串精确匹配

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

-y                              -i 的过时同义词。

输出控制选项:

-c, --count        打印匹配行的个数

--color[=WHEN], --colour[=WHEN]        设置显示颜色

-L, --files-without-match        打印不匹配的文件名,在第一次匹配时停止扫描

-l, --files-with-matches        打印匹配的文件名,在第一次匹配时停止扫描

-m NUM, --max-count=NUM        结束读取前最多匹配的行数

-o, --only-matching        只打印匹配的部分

-q, --quiet, --silent        不输出内容

-s, --no-messages        不打印错误信息

输出行前缀控制选项:

-b, --byte-offset        打印文件中从 0 开始的字节偏移量

-H, --with-filename        打印文件名

-h, --no-filename        不打印文件名

--label=LABEL        将实际来自标准输入的输入显示为来自文件 LABEL 的输入

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

-T, --initial-tab        确保实际行内容的第一个字符位于制表位上

-u, --unix-byte-offsets        报告 Unix 风格的字节偏移

-Z, --null        在每个文件名后边打印一个空字符

上下文行控制选项:

-A NUM, --after-context=NUM        打印匹配行加上后边 NUM 行

-B NUM, --before-context=NUM        打印匹配行前边 NUM 行加上匹配行

-C NUM, -NUM, --context=NUM        打印输出的上下 NUM 行

--group-separator=SEP        使用 SEP 作为组分隔符,默认是 “--”

--no-group-separator            组分隔符为空

文件和目录选择选项:

-a, --text        把二进制文件当作文本文件

--binary-files=TYPE        把二进制文件当作 TYPE 类型文件

-D ACTION, --devices=ACTION        使用 ACTION 操作设备、管道、套接字

-d ACTION, --directories=ACTION        使用 ACTION 操作目录

--exclude=GLOB        不匹配 GLOB 通配符描述的文件名

--exclude-from=FILE        不匹配 FILE 中的通配符格式

--exclude-dir=GLOB        不匹配 GLOB 通配符描述的目录

-I(大写的i)                   处理二进制文件,就好像它不包含匹配数据一样

--include=GLOB        只匹配 GLOB 通配符描述的文件名

-r, --recursive        递归搜索,不跟随软链

-R, --dereference-recursive        递归搜索,跟随软链

其他选项:

--line-buffered        使用行缓冲区

-U, --binary        把文件当作二进制文件

-z, --null-data        把文件的行末视作以空字符结尾

正则表达式: 

grep 命令使用的匹配 PATTERN 遵循正则表达式规则。

请看我写的关于正则表达式的文档:

神奇的正则表达式_yspg_217的博客-CSDN博客

这个文档我觉得是内容全面、描述简要的范例了。 

正则表达式的分类

在 shell 中,正则表达式分为基础和扩展两种,在使用 grep 命令时有明确的区分。来看看这两种的区别。

1. 基础

包括的元字符有 ^ $ . [ ] * ,其他的任何符号被视作普通字符,有几个例外是 ( ) { },这几个符号需要跟在转义符(\)后边才被视作元字符。

2. 扩展

包括的元字符有 ^ $ . [ ] * ( ) { } ? + | ,其他符号被视作普通字符。

使用示例:

匹配 zip:

[root@server dire]# ls /usr/bin/ | grep zip
bunzip2
bzip2
bzip2recover
funzip
gpg-zip
gunzip
gzip
unzip
unzipsfx
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit

匹配 zip 前有任意字符的情况: 

[root@server dire]# ls /usr/bin/ | grep '.zip'
bunzip2
bzip2
bzip2recover
funzip
gpg-zip
gunzip
gzip
unzip
unzipsfx

匹配 zip 在行首的情况: 

[root@server dire]# ls /usr/bin/ | grep '^zip'
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit

匹配 zip 在行尾的情况: 

[root@server dire]# ls /usr/bin/ | grep 'zip$'
funzip
gpg-zip
gunzip
gzip
unzip
zip

 匹配 zip 占据整行的情况:

[root@server dire]# ls /usr/bin/ | grep '^zip$'
zip

 匹配 zip 前一位是 b 或 g 的情况:

[root@server dire]# ls /usr/bin/ | grep '[bg]zip'
bzip2
bzip2recover
gzip

 匹配 zip 前一位不是 b 或 g 的情况:

[root@server dire]# ls /usr/bin/ | grep '[^bg]zip'
bunzip2
funzip
gpg-zip
gunzip
unzip
unzipsfx

匹配行首是大写字母的行:

[root@server dire]# ls /usr/bin/ | grep '^[A-Z]'
Mail

匹配有大写字母的行: 

[root@server dire]# ls /usr/bin/ | grep '[A-Z]'
Mail

把正则表达式的顺序微调,下边的例子匹配有 "-" 或 A 或 Z 的行:

[root@server dire]# ls /usr/bin/ | grep '[-AZ]'
bashbug-64
ca-legacy
centrino-decode
cheetah-analyze
cheetah-compile
...

下边举几个扩展正则的例子:

匹配 bz 或 gz 或 z 开头,后边跟 ip 的行,这里用到了扩展正则中的 小括号 和 或符号"|":

[root@server dire]# ls /usr/bin/ | grep -E '^(bz|gz|z)ip'
bzip2
bzip2recover
gzip
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit

看一下扩展和基本正则实现相同功能的不同格式,基本的需要给花括号加反斜杠: 

[root@server dire]# ls /usr/bin/ | grep -E 'm{2}'
comm
command
msgcomm
[root@server dire]# ls /usr/bin/ | grep 'm\{2\}'
comm
command
msgcomm

 想到再补充

Logo

更多推荐