当前位置: 首页 > 工具软件 > GNU grep > 使用案例 >

Linux 文本检索工具grep的使用

苗森
2023-12-01

何为grep命令

grep是Linux系统中强大的文本检索工具,它可以使用正则表达式,搜索输入文本中匹配的记录,并输出。
grep命令家族包含grepfgrepegrepfgrep相当于grep -Fegrep相当于grep -E

grep 支持BREEREPerl规范的正则表达式,默认使用BRE

grep语法

grep [-options]

grepoptions选项主要包含四大类:

  • 输出控制
  • 上下文控制
  • 正则表达式类型的选择
  • 其他杂项,比如输出版本信息

输出控制(Output Control)

  • -b--byte-offset:在显示匹配的行之前,标识出该行第一个字符在该文件或输入流中的字节偏移量
    例如,显示字符串3456所在的行中第一个字符的字节偏移量(示例字符流为helloworld\n123456):

    [root@local ~]# echo -e "helloworld\n123456" | grep -b "3456"
    11:123456
    
  • -c--count:计算一共有多少符合正则表达式的记录。
    例如下面的例子中可以显示当前主机有多少个TIME_WAIT连接:

    [root@local ~]# netstat -ano | grep -c "TIME_WAIT"
    

    相当于在netstat -ano输出的结果中,找出一共有多少个TIME_WAIT关键字

  • -m<次数>--max-count=<次数>:当匹配记录达到多少次后停止检索

    [root@local ~]# echo -e "abc\nabc\nabc" | grep -m2 "abc"
    abc
    abc
    
  • -n--line-number:在打印匹配行之前加上该行行号
    例如下面命令可以显示文件.bash_profileexport所在单词的行号和行内容:

    [root@local ~]# grep -n "export" .bash_profile
    12:export PATH
    
  • -h--no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。

    [root@local ~]# grep -drecurse -h "export"
    export PATH
    
  • -H--with-filename:与-h相反,标识所属的文件名称:

    [root@local ~]# grep -drecurse -h "export"
    .bash_profile:export PATH
    
  • -o--only-matching:只打印出匹配正则表达式的文本,不打印出所在的行

    [root@izj6cid7b1uq3w3cmzmf7ez ~]# grep -o "export" .bash_profile
    export
    
  • -q--quiet--slient:不输出任何信息

  • -d <动作>--directories=<动作>:当指定的路径是文件夹而非文件时,需要使用该参数。“动作”参数主要包含三种:readrecurseskip三种:

    1. read在扫描指定路径时,若包含子目录时会报错。
    2. recurse在扫描指定路径时,若包含子目录时,会进入子目录递归检索文件,等同于-r--recursive
    3. skip在扫描指定路径时,若包含子目录时,会跳过。

    使用案例:

    [root@local ~]# grep -drecurse "export"
    .bash_profile:export PATH
    
  • -l--file-with-matches:只列出符合正则表达式的文件名,不显示具体的行
    例如下面的命令可以找出当前目录下存在长度超过20个字母的单词的文件名(省略输出)

    [root@local ~]# grep -l -e "\w\{20,\}" -drecurse
    
  • -L--files-without-match:与-I相反,列出不符合正则表达式

  • -a--text:不忽略二进制(非文本)数据

  • --include=<正则表达式>:只检索文件名或文件夹名匹配指定正则表达式的文件

  • --exclude=<正则表达式>:不检索文件名或文件夹名匹配指定正则表达式的文件

  • --exclude-dir=<正则表达式>:不检索文件夹名匹配指定正则表达式的文件

  • --exclude-from=<正则表达式>:不检索文件名匹配指定正则表达式的文件

  • --line-buffered:每次搜索到匹配行后都会flush一次输出缓冲区

上下文控制(Context Control)

  • -A<显示行数>--after-context=<显示行数>:除了显示符合给定正则表达式的记录以外,还显示该行之后的内容。
    在下面的示例中需要查找出处于TIME_WAIT连接的信息,找到匹配行后,如果我想要输出紧接着的后面一行,那么可以使用grep -A1,如果不需要输出后面的一行,那么使用grep -A0或忽略-A0即可。
    [root@local ~]# netstat -ano | grep -A1 "TIME_WAIT"
    tcp        0      0 172.17.38.237:43528     100.103.0.45:80         TIME_WAIT   timewait (19.63/0/0)
    tcp        0      0 172.17.38.237:59932     172.217.24.46:443       ESTABLISHED off (0.00/0/0)
    --
    tcp        0      0 172.17.38.237:35216     172.217.174.194:443     TIME_WAIT   timewait (43.74/0/0)
    tcp        0      0 172.17.38.237:51822     172.217.26.131:443      ESTABLISHED off (0.00/0/0)
    
    [root@local ~]# netstat -ano | grep -A0 "TIME_WAIT"
    tcp        0      0 172.17.38.237:43528     100.103.0.45:80         TIME_WAIT   timewait (8.81/0/0)
    --
    tcp        0      0 172.17.38.237:35216     172.217.174.194:443     TIME_WAIT   timewait (32.92/0/0)
    
  • -B<显示行数>--before-context=<显示行数>:和-A类似,只不过显示的是匹配行之前的行
  • -C<显示行数>-<显示行数>--context=<显示行数>:相当于-A-B的结合,显示匹配行前后的行记录。
  • -U--binary,检索时不忽略\r字符(Windows使用\r\n作为换行符)

正则表达式控制(Regexp selection and interpretation)

  • -e<正则表达式>--regexp=<正则表达式>:指定字符串作为查找文件内容的正则表达式。
    [root@local ~]# grep -e export .bash_profile
    export PATH
    
    当然也可以不使用-e
    [root@local ~]# grep export .bash_profile
    export PATH
    
    如果正则表达式包含空格,需要使用双引号。
  • -i--ignore-case:忽略大小写差别
    [root@local ~]# grep -drecurse -i "Export"
    .bash_profile:export PATH
    
  • -w--word-regxp:只匹配单词,也就是在读取文件时会以空格为分隔符将其拆分为多个单词,然后逐一比对
    [root@local~]# echo -e "hello world" | grep "hello w"
    hello world
    [root@local ~]# echo -e "hello world" | grep -w "hello w"
    
  • -x--line-regexp:和-w不同,-x会以换行符\n为分隔符,将文件拆分为多个部分,再逐一比对
  • -f<规则文件路径>--file=<规则文件路径>:指定一个规则文件,包含多个正则表达式,用换行符隔开。
    下面这个例子创建了一个规则文件rule,包含两个规则:helloworld,然后查找文本the world is my oyster中,符合这两个规则的文本所在的行:
    [root@local ~]# echo -e "hello\nworld" > rule
    [root@local ~]# echo "the world is my oyster" | grep -f rule 
    the world is my oyster
    
  • -F--fixed-strings:将正则表达式视为固定字符串的列表
  • -z--null-data:每行以\0结尾,而不是\n
  • -G--basic-regexp:使用BRE规范的正则表达式
  • -E--extended-regexp:使用ERE规范的正则表达式
  • -P--perl-regexp:使用Perl规范的正则表达式

杂项

  • -s--no-messages:不显示错误信息
  • -v--revert-match:显示不包含匹配文本所在的行
    [root@local ~]# echo -e "hello\nworld" | grep -v "hello"
    world
    
  • -V--version:显示grep版本信息
    [root@local ~]# grep -V
    grep (GNU grep) 2.20
    Copyright (C) 2014 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
    
  • --help:查看帮助信息
 类似资料: