shell脚本编程中的grep命令

时间:2021-04-28 08:56:29

grep命令语法


grep命令使用一个选项一个要匹配的模式要搜索的文件,它的语法如下所示:

grep  [options]  PATTERN  [FILES]

如果没有提供文件名,则grep命令将搜索标准输入。

  1. options

    选项 含义
    -c   输出匹配行的数目,而不是输出匹配的行
    -E   启用扩展表达式
    -h   取消每个输出行的普通前缀,即匹配查询模式的文件名
    -i   忽略大小写
    -l   只列出包含匹配行的文件名,而不输出真正的匹配行
    -v   对匹配模式取反,即搜索不匹配行而不是匹配行


  2. PATTERN

    匹配模式采用正则表达式。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

    给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
    1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
    2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

    正则表达式的特点是:
    1. 灵活性、逻辑性和功能性非常的强;
    2. 可以迅速地用极简单的方式达到字符串的复杂控制。
    3. 对于刚接触的人来说,比较晦涩难懂。

    由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用

    在正则表达式的使用过程中,一些字符是以特定方式处理的。grep命令支持且最常用的特殊字符如下表所示:


    字符              
    含义
    ^ 指向一行的开头
    $ 指向一行的结尾
    . 任意单个字符
    [ ] 方括号内包含一个字符范围,其中任何一个字符都可以被匹配,例如字符范围a~e,或在字符范围前面加上^符号表示使用反向字符范围,即不匹配指定范围的内的字符。

    如果想将上述字符用作普通字符,就需要在它们前面加上\字符。例如,如果想使用$字符,需要将它写为 \$ 。

    在方括号中还可以使用一些有用的特殊匹配模式。如下表所示:

    匹配模式 含义
    [:alnum:] 字母与数字字符
    [:alpha:] 字母
    [:ascii:] ASCII字符
    [:blank:] 空格或制表符
    [:cntrl:] ASCII控制字符
    [:digit:] 数字
    [:graph:] 非控制、非空格字符
    [:lower:] 小写字母
    [:print:] 可打印字符
    [:punct:] 标点符号字符
    [:space:] 空白字符,包括垂直制表字符
    [:upper:] 大写字母
    [:xdigit:] 十六进制数字

    另外,如果指定了用于扩展匹配的-E选项,那些用于控制匹配完成的其他字符可能会遵循正则表达式的规则,如下表所示:

    选项 含义
    ? 匹配是可选的,但最多匹配一次
    * 必须匹配0次或多次
    + 必须匹配1次或多次
    {n} 必须匹配n次
    {n, } 必须匹配n次或者n次以上
    {n,m} 匹配次数在n到m之间,包括n和m

    对于shell中的grep命令来说,需要在这些字符之前加上 \ 字符。

grep命令示例


  1. 第一个例子是查找以字母e结尾的行。
    <span style="font-size:12px;">grep e$ words.txt</span>

  2. 查找以字母a结尾的单词。
    <span style="font-size:12px;">grep a[[:blank:]] words2.txt</span>

  3. 查找以Th开头的由3个字母组成的单词。
    <span style="font-size:12px;">grep Th.[[:space:]] words2.txt</span>