zoukankan      html  css  js  c++  java
  • 一天一个 Linux 命令(19):grep 命令

    一、简介

    Linux系统里的grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

    grep 指令用于查找内容包含指定的字符的文件,如果发现某文件的内容符合所指定的字符,预设 grep 指令会把含有字符的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

    grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

    grep在shell脚本的使用中,grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

    作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的。

    二、格式说明

    grep [OPTION]... PATTERN [FILE]...
    
    
    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
    
    Regexp selection and interpretation:
      -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
      -F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
      -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
      -P, --perl-regexp         PATTERN is a Perl regular expression
      -e, --regexp=PATTERN      use PATTERN for matching
      -f, --file=FILE           obtain PATTERN from FILE
      -i, --ignore-case         ignore case distinctions
      -w, --word-regexp         force PATTERN to match only whole words
      -x, --line-regexp         force PATTERN to match only whole lines
      -z, --null-data           a data line ends in 0 byte, not newline
    
    Miscellaneous:
      -s, --no-messages         suppress error messages
      -v, --invert-match        select non-matching lines
      -V, --version             display version information and exit
          --help                display this help text and exit
    
    Output control:
      -m, --max-count=NUM       stop after NUM matches
      -b, --byte-offset         print the byte offset with output lines
      -n, --line-number         print line number with output lines
          --line-buffered       flush output on every line
      -H, --with-filename       print the file name for each match
      -h, --no-filename         suppress the file name prefix on output
          --label=LABEL         use LABEL as the standard input file name prefix
      -o, --only-matching       show only the part of a line matching PATTERN
      -q, --quiet, --silent     suppress all normal output
          --binary-files=TYPE   assume that binary files are TYPE;
                                TYPE is 'binary', 'text', or 'without-match'
      -a, --text                equivalent to --binary-files=text
      -I                        equivalent to --binary-files=without-match
      -d, --directories=ACTION  how to handle directories;
                                ACTION is 'read', 'recurse', or 'skip'
      -D, --devices=ACTION      how to handle devices, FIFOs and sockets;
                                ACTION is 'read' or 'skip'
      -r, --recursive           like --directories=recurse
      -R, --dereference-recursive
                                likewise, but follow all symlinks
          --include=FILE_PATTERN
                                search only files that match FILE_PATTERN
          --exclude=FILE_PATTERN
                                skip files and directories matching FILE_PATTERN
          --exclude-from=FILE   skip files matching any file pattern from FILE
          --exclude-dir=PATTERN directories that match PATTERN will be skipped.
      -L, --files-without-match print only names of FILEs containing no match
      -l, --files-with-matches  print only names of FILEs containing matches
      -c, --count               print only a count of matching lines per FILE
      -T, --initial-tab         make tabs line up (if needed)
      -Z, --null                print 0 byte after FILE name
    
    Context control:
      -B, --before-context=NUM  print NUM lines of leading context
      -A, --after-context=NUM   print NUM lines of trailing context
      -C, --context=NUM         print NUM lines of output context
      -NUM                      same as --context=NUM
          --group-separator=SEP use SEP as a group separator
          --no-group-separator  use empty string as a group separator
          --color[=WHEN],
          --colour[=WHEN]       use markers to highlight the matching strings;
                                WHEN is 'always', 'never', or 'auto'
      -U, --binary              do not strip CR characters at EOL (MSDOS/Windows)
      -u, --unix-byte-offsets   report offsets as if CRs were not there
                                (MSDOS/Windows)
    
    'egrep' means 'grep -E'.  'fgrep' means 'grep -F'.
    Direct invocation as either 'egrep' or 'fgrep' is deprecated.
    When FILE is -, read standard input.  With no FILE, read . if a command-line
    -r is given, - otherwise.  If fewer than two FILEs are given, assume -h.
    Exit status is 0 if any line is selected, 1 otherwise;
    if any error occurs and -q is not given, the exit status is 2.
    

    三、选项说明

    -a,--text : 不忽略二进制的数据。
    -A<显示行数>,--after-context=<显示行数> : 除了显示符合字符的那一行之外,并显示该行之后的内容。
    -b,--byte-offset : 在显示符合字符的那一行之前,标示出该行第一个字符的编号。
    -B<显示行数> ,--before-context=<显示行数> : 除了显示符合字符的那一行之外,并显示该行之前的内容。
    -c, --count : 计算符合字符的列数。
    -C<显示行数>, --context=<显示行数>或-<显示行数> : 除了显示符合字符的那一行之外,并显示该行之前后的内容。
    -d <动作>, --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
    -e<字符>, --regexp=<字符> : 指定字符串做为查找文件内容的字符。
    -E, --extended-regexp : 将字符为延伸的正则表达式来使用。
    -f<规则文件>, --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则字符,让grep查找符合规则条件的文件内容,格式为每行一个规则字符。
    -F, --fixed-regexp : 将字符视为固定字符串的列表。
    -G, --basic-regexp : 将字符视为普通的表示法来使用。
    -h, --no-filename : 在显示符合字符的那一行之前,不标示该行所属的文件名称。
    -H, --with-filename : 在显示符合字符的那一行之前,表示该行所属的文件名称。
    -i, --ignore-case : 忽略字符大小写的差别。
    -l, --file-with-matches : 列出文件内容符合指定的字符的文件名称。
    -L, --files-without-match : 列出文件内容不符合指定的字符的文件名称。
    -n, --line-number : 在显示符合字符的那一行之前,标示出该行的列数编号。
    -o, --only-matching : 只显示匹配PATTERN 部分。
    -q, --quiet或--silent : 不显示任何信息。
    -r, --recursive : 此参数的效果和指定"-d recurse"参数相同。
    -s, --no-messages : 不显示错误信息。
    -v, --invert-match : 显示不包含匹配文本的所有行。
    -V, --version : 显示版本信息。
    -w, --word-regexp : 只显示全字符合的列。
    -x, --line-regexp : 只显示全列符合的列。
    -y : 此参数的效果和指定"-i"参数相同。
    

    四、命令功能

    用于过滤/搜索的特定字符。也可使用正则表达式,多种命令配合使用,使用上更加灵活。

    五、常见用法

    1.在文件中查找要搜索的字符

    grep joshua317 test.txt
    

    2.在多个文件中查找关键词

    grep joshua317 test.txt test2.txt
    
    #result:
    # grep joshua317 test.txt test2.txt
    test.txt:joshua317
    test.txt:joshua317
    grep: test2.txt: No such file or directory
    

    3.在文件中查找要搜索的字符,并显示行数

    grep -n joshua317 test.txt
    
    #result:
    # grep -n joshua317 test.txt
    2:joshua317
    7:joshua317
    

    4.反向查找。上面的例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。

    grep -v joshua317 test.txt 
    
    #result:
    # grep -v joshua317 test.txt 
    hello
    i
    love
    China
    ,
    my
    name
    yes
    

    5.查找时不区分大小写

    grep –i "joshua317" test.txt 
    

    6.查找后缀有txt字样的文件中包含 joshua317字符串的文件

    grep -l joshua317 *txt
    
    #result:
    # grep -l joshua317 *txt
    test.txt
    

    7.以递归的方式查找符合条件的文件

    grep -r joshua317 /root/test
    
    #result:
    # grep -r joshua317 test
    test/tree.txt:joshua317
    test/test.txt:joshua317
    test/test2/test.txt:joshua317
    

    8.管道符使用,查找指定进程

    ps -ef|grep java
    

    9.管道符使用,grep不显示本身进程

    ps aux | grep java | grep -v "grep"
    

    10.管道符使用,查找指定进程个数

    ps -ef|grep -c java
    

    11.从文件中读取关键词进行搜索,输出一个文件中含有从另外一个文件中读取出的关键词的内容行

    cat test.txt | grep -f joshua317
    

    12.从当前目录开始查找所有扩展名为 .txt 的文本文件,并找出包含 "joshua317" 的行

    find ./ -name "*.txt" | xargs grep "joshua317"
    

    13.从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:

    find / -type f -name "*.log" | xargs grep "ERROR"
    

    14.从文件内容查找与正则表达式匹配的行

    grep –e "正则表达式" 文件名
    

    15.查找以j开头的行内容

    cat test.txt |grep ^j
    
    #result:
    # cat test.txt |grep ^j
    joshua317
    joshua317
    

    16.查找非u开头的行内容

    cat test.txt |grep ^[^j]
    
    #result:
    # cat test.txt |grep ^[^j]
    hello
    i
    love
    China
    ,
    my
    name
    yes
    

    17.查找以na结尾的行内容

    cat test.txt |grep na$
    
    #result:
    # cat test.txt |grep na$
    China
    

    18.显示包含ove或者shua字符的内容行

    cat test.txt |grep -E "ove|shua"
    
    #result:
    # cat test.txt |grep -E "ove|shua"
    joshua317
    love
    joshua317
    

    19.查找当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有3个连续小写字符的字符串的行

    grep '[a-z]{3}' *.txt
    
    #result:
    # grep '[a-z]{3}' *.txt
    test2.txt:ove
    test2.txt:ina
    test.txt:hello
    test.txt:joshua317
    test.txt:love
    test.txt:China
    test.txt:joshua317
    test.txt:name
    test.txt:yes
    

    20.查找文件中字符串至少有3个数字的字符串的行

    grep '[0-9]{3}' test.txt
    
    #result:
    # grep '[0-9]{3}' test.txt
    joshua317
    joshua317
    

     

  • 相关阅读:
    django_开发报错
    SpringBoot 前后端数据参数交互
    消息队列学习笔记(一)
    2021年调用工商二维码退款查询接口
    2021年调用工商二维码退款接口
    2021年调用工商二维码生成接口及回调接口demo
    调用工商生成二维码接口文档的坑
    使用hutool工具类转换时间
    微信模板消息推送
    pom文件 spring-boot-maven-plugin 爆红
  • 原文地址:https://www.cnblogs.com/joshua317/p/15343938.html
Copyright © 2011-2022 走看看