美文网首页
Linux||正则表达式及grep命令

Linux||正则表达式及grep命令

作者: 小汪Waud | 来源:发表于2021-11-19 21:59 被阅读0次

    以下内容首发自公众号“小汪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

    注意!

    1. { }为限定范围的字符,但因为 { 和 } 的符号在shell中是有特殊意义的,因此必须使用转义符" \ "使其失去特殊意义。
    2. *作为通配符时表示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
    

    参考资料

    1. 菜鸟教程

    https://www.runoob.com/linux/linux-comm-grep.html

    1. 「生信技能树」2021公益课(linux基础 & conda)

    https://www.bilibili.com/video/BV1Yy4y117SX?p=12

    1. 鸟哥的Linux私房菜

    相关文章

      网友评论

          本文标题:Linux||正则表达式及grep命令

          本文链接:https://www.haomeiwen.com/subject/pyietrtx.html