以下内容首发自公众号“小汪Waud”。
本期介绍在Linux环境下的正则表达式及grep命令。
1 正则表达式
正则表达式(Regular Expression)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些字符的特定组合,组成一个“规则字符串”,这个字符串用来表达对字符串的一种过滤逻辑。
正则表达式基本上是一种表示法,只要程序支持这种表示法,该程序就可以用来作为正则表达式的字符串处理之用。如vi、grep、awk、sed等程序支持正则表达式,所以可以使用正则表达式的特殊字符来进行字符串的处理。但例如cp、ls等命令并不支持正则表达式,所以只能用自己的通配符。
需要注意的是,正则表达式与通配符有着本质上的区别。鸟叔的解释是通配符(wildcard)代表的是bash操作接口的一个功能,但正则表达式则是一种字符串处理的表示方式。同时,因为正则表达式是处理字符串的一种表达方式,所以对字符排序有影响的语序数据会对正则表达式的结果有影响。
正则表达式依照不同的严谨度分为:基础正则表达式和扩展正则表达式。
1.1 基础正则表达式
- ^ 待查找的字符串在行首
- $ 待查找的字符串在行尾
- . 换行符以外的任意单个字符
- *匹配之前项0次或多次
- {n} 匹配之前项n次
- {n,} 匹配至少n次
- {m,n} 匹配至少m次,至多n次
- [list] 匹配list中任意一个
- [n1-n2] 匹配范围如[A-Z]即匹配所有大写字符
- [^list] 反向匹配list
注意!
- { }为限定范围的字符,但因为 { 和 } 的符号在shell中是有特殊意义的,因此必须使用转义符" \ "使其失去特殊意义。
- *作为通配符时表示0~无限个字符的意思,而作为正则表达式时表示匹配之前项0次或多次。
# 输出任何以a为结尾的文件
ls *a # 通配符
ls | grep '.*a$' # 正则表达式
1.2 扩展正则表达式
- +:匹配前面的字符1次或多次
- ?:匹配前面的字符0次或1次
- |:用或的方式找出多个字符串
- ( ):匹配群组字符串
- ( )+:多个重复群组的判别
2 grep命令
grep是一种强大的文本搜索工具,可以使用正则表达式匹配模式查找文件里符合条件的字符串,并打印出来。
有点类似于WORD里的查找功能。
grep支持三种正则表达式语法:Basic、Extended和perl兼容。如果没有提供正则表达式类型,grep将搜索模式解释为基本的正则表达式。要将模式解释为扩展正则表达式,请使用-E。
查看grep的帮助文档,如下
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c
参数太长,这里就不放了
基本用法
grep [OPTION]... PATTERN [FILE]...
高级用法
grep [-A] [-B] [--color=auto] "查找字符" [模式] [文件]
- -A:after 后面可加数字,表示除了该行,后面n行也将打印出来
- -B:before 后面可加数字,表示除了该行,前面n行也将打印出来
- --color=auto 可将查找出来的字符标注颜色
- 文件可为空格间隔的多个文件。
常用参数
- -w word,以字符串为单位,精确查找每个关键词
- -f 从指定文件中读取要匹配的字符
- -r 从指定目录中查找
- -v 反向选择,输出没有匹配的行
- -n 显示成功匹配的行所在的行号
- -e else,指定多个关键词
- -c 统计成功匹配的行的数量
- -i 忽略大小写
示例1
首先通过cat命令查看samples.txt的内容,如下图
如果想检索以K为行首的行,通过以下命令即可得到
grep '^K' samples.txt # 注意^在K前面
如果想检索以Z为行尾的行,通过以下命令即可得到
grep 'z$' samples.txt # 注意$在z后面
如果想检索三个字符其中前面为K,后面为D中间字符,为任意字符,通过以下命令即可得到
grep 'K.D' samples.txt
参考资料
- 菜鸟教程
https://www.runoob.com/linux/linux-comm-grep.html
- 「生信技能树」2021公益课(linux基础 & conda)
https://www.bilibili.com/video/BV1Yy4y117SX?p=12
- 鸟哥的Linux私房菜
网友评论