shell 编程三剑客之一:grep 详解
linux 命令:grep 详解
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 遵循正则表达式规则。
请看我写的关于正则表达式的文档:
这个文档我觉得是内容全面、描述简要的范例了。
正则表达式的分类
在 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
想到再补充
更多推荐
所有评论(0)