grep

    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

    1. $ # 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
    2. . # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
    3. * # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
    4. .* # 一起用代表任意字符。
    5. [] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
    6. [^] # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
    7. \(..\) # 标记匹配字符,如'\(love\)',love被标记为1。
    8. \< # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
    9. \> # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
    10. x\{m\} # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
    11. x\{m,\} # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
    12. x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
    13. \w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
    14. \W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
    15. \b # 单词锁定符,如: '\bgrep\b'只匹配grep。

    grep命令常见用法

    在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:

    1. grep match_pattern file_name
    2. grep "match_pattern" file_name

    在多个文件中查找:

      输出除之外的所有行 -v 选项:

      1. grep -v "match_pattern" file_name

      标记匹配颜色 —color=auto 选项:

      1. grep "match_pattern" file_name --color=auto

      只输出文件中匹配到的部分 -o 选项:

      1. echo this is a test line. | grep -o -E "[a-z]+\."
      2. echo this is a test line. | egrep -o "[a-z]+\."
      3. line.

      统计文件或者文本中包含匹配字符串的行数 -c 选项:

      1. grep -c "text" file_name

      输出包含匹配字符串的行数 -n 选项:

      1. grep "text" -n file_name
      2. cat file_name | grep "text" -n
      3. #多个文件
      4. grep "text" -n file_1 file_2

      打印样式匹配所位于的字符或字节偏移:

      1. echo gun is not unix | grep -b -o "not"
      2. 7:not
      3. #一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配合使用。

      搜索多个文件并查找匹配文本在哪些文件中:

      1. grep -l "text" file1 file2 file3...

      忽略匹配样式中的字符大小写:

      1. echo "hello world" | grep -i "HELLO"
      2. hello

      选项 -e 制动多个匹配样式:

      1. echo this is a text line | grep -e "is" -e "line" -o
      2. is
      3. cat patfile
      4. aaa
      5. bbb
      6. echo aaa bbb ccc ddd eee | grep -f patfile -o

      在grep搜索结果中包括或者排除指定文件:

      1. #只在目录中所有的.php和.html文件中递归搜索字符"main()"
      2. grep "main()" . -r --include *.{php,html}
      3. #在搜索结果中排除所有README文件
      4. grep "main()" . -r --exclude "README"
      5. #在搜索结果中排除filelist文件列表里的文件
      6. grep "main()" . -r --exclude-from filelist

      使用0值字节后缀的grep与xargs:

      1. # 测试文件:
      2. echo "aaa" > file1
      3. echo "bbb" > file2
      4. echo "aaa" > file3
      5. grep "aaa" file* -lZ | xargs -0 rm
      6. #执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。

      grep静默输出:

      1. # 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。