在Linux系统中,有三个非常常用的文本处理命令:grep,awk,sed。使用这三个命令可以实现非常“炫酷”的文本操作。这篇博文就带大家一起来认识这三个命令中的grep命令。

1. grep

        grep命令用来对Linux中的文本进行匹配。

            $ echo -e "this is a word\nnext line" | grep word
            this is a word

      也可以使用它在文件中进行匹配。

            $ grep pattern filename
            this is the line containing pattern

       文件可以指定多个。

      $ grep "match_text" file1 file2 file3 ...

      匹配模式也可以指定多个,每个格式之间是or的关系

      $ grep -e "match_text1" f -e "match_text2" file

      grep命令支持使用正则表达式。以上的命令使用的都是基础的正则表达式,-E选项使grep可以使用扩展的正则表达式,也可以使用egrep命令来替代。

      $ grep -E "[a-z]+" filename

     使用选项-o可以只输出匹配到的文本。

      $ echo this is a line. | egrep -o "[a-z]+\."
      line

     选项-v可以起到反转的效果,打印出不匹配match_pattern的所有行。

      $ grep -v match_pattern file

      选项-c能够统计出匹配模式的文本行数。

      $ grep -c "text" filename
      10

      选项-n可以打印出匹配字符串所在行的行号。

      $ cat sample1.txt
      gnu is not unix
      linux is fun
      bash is art
      $ cat sample2.txt
      planetlinux
      $ grep linux -n sample1.txt
      2:linux is fun

     如果涉及多个文件,该选项也会随输出结果打印出文件名。

     $ grep linux -n sample1.txt sample2.txt
     sample1.txt:2:linux is fun
     sample2.txt:2:planetlinux

      使用-R或-r选项可以使grep实现递归搜索。

        $ cd src_dir
        $ grep "test_function()" . -R -n
        ./miscutils/test.c:16:test_function();

     使用-q选项可以使grep实现静默输出,在静默模式中,grep命令不会输出任何内容。它仅是运行命令,然后根据命令执行成功与否返回退出状态。0表示匹配成功,非0表示匹配失败,下面这个脚本利用grep的静默模式来测试文件中是否有匹配文本。

        #!/bin/bash
        # 文件名: silent_grep.sh
        # 用途: 测试文件是否包含特定的文本内容
        if [$# -ne 2]; then
          echo "Usage: $0 match_text filename"
          exit 1
        fi
        match_text=$1
        filename=$2
        grep -q "$match_text" $filename
        if [$? -eq 0]; then
          echo "The text exists in the file"
        else
          echo "Text does not exist in the file"
        fi

    选项-l可以列出匹配模式所在的文件。

        $ grep -l linux sample1.txt sample2.txt
        sample1.txt
        sample2.txt

   与之相反的是,-L选项会返回一个不匹配的文件列表。

    在grep中,可以指定在指定的文件中搜索,要做到这一点,需要为命令添加--include选项。

        $ grep "main()" . -r   --include *.{c,cpp}

    使用选项--exclude在搜索过程中排除指定的文件。

        $ grep "main()" . -r --exclude "README"

    --exclude-dir可以排除目录

        $ grep main . -r -exclude-dir CVS

    使用-w选项可以实现匹配整个单词,而不是单词的某一部分。

      $ grep -w "text" filename

    通过参数控制,可以打印匹配的单词前后具体的行。

    -A: 指定输出匹配结果及之后的额外行数。

        $ seq 10 | grep 5 -A 3
        5 6 7 8

   -B:指定输出匹配结果及之前的额外行数。

        $ seq 10 | grep 5-B 3
        2 3 4 5

   -C:指定输出匹配结果之前及之后的额外行数。

        $ seq 10 | grep 5-C 3
        2 3 4 5 6 7 8