grep命令

grep -i “word” filepath -->忽略大小写匹配

image-20250409111413253

grep -v “word” filepath --> 反向匹配

# 显示所有不包含 “error” 的行。

image-20250409111552861

grep -w “word” filepath --> 匹配完整单词

image-20250409111654829

grep -c “pattern” filepath # 输出匹配 “pattern” 的行数

image-20250409111736630

grep -n “pattern” filepath 显示匹配行及其行号。

image-20250409111943440

grep -r “pattern” directory/ 递归搜索目录下所有文件

image-20250409112806150

grep -l “pattern” *.txt 只显示包含匹配内容的文件名,不显示具体的行

image-20250409112855639

image-20250409113047933

grep -h “pattern” filepath 在多文件搜索的时候不显示文件名

image-20250409113126840

image-20250409113159584

grep -B Number “pattern” filepath 显示匹配行及其前 NUM 行。(就是你之前问的选项)

-B NUM--before-context=NUM: 显示匹配行及其前 NUM 行。(就是你之前问的选项)

image-20250409113241286

image-20250409113333868

grep -C Number "pattern " filepath 显示匹配行及其前后 NUM 行。

image-20250409113442370


好的,下面更全面地介绍一下 grep 命令的用法:

基本语法:

grep [选项] 模式 [文件...]
  • grep: 命令本身。
  • [选项]: 可选的参数,用来控制 grep 的行为。
  • 模式: 你要搜索的字符串或正则表达式。
  • [文件...]: 要搜索的文件名。如果没有指定文件名,grep 会从标准输入读取数据。

常用选项:

  • -i--ignore-case: 忽略大小写进行匹配。

    grep -i "hello" myfile.txt  # 匹配 "hello"、"Hello"、"HELLO" 等。
    
  • -v--invert-match: 反向匹配,只显示不包含模式的行。

    grep -v "error" logfile.txt  # 显示所有不包含 "error" 的行。
    
  • -w--word-regexp: 仅匹配整个单词。

    grep -w "word" myfile.txt  # 只匹配单独的 "word",不匹配 "sword" 或 "wordy"。
    
  • -c--count: 只显示匹配的行数,不显示具体的行。

    grep -c "pattern" myfile.txt # 输出匹配 "pattern" 的行数
    
  • -n--line-number: 显示匹配行及其行号。

    grep -n "pattern" myfile.txt #输出匹配行的内容及其行号
    
  • -r-R--recursive: 递归地搜索目录下的所有文件。-r 遵循符号链接, -R 不遵循符号链接。

    grep -r "pattern" directory/  # 在 directory/ 及其所有子目录下的文件中搜索 "pattern"。
    
  • -l--files-with-matches: 只显示包含匹配内容的文件名,不显示具体的行。

    grep -l "pattern" *.txt  # 显示当前目录下所有包含 "pattern" 的 txt 文件名。
    
  • -h--no-filename: 在多文件搜索时,不显示文件名。

    grep -h "pattern" file1.txt file2.txt
    
  • -E--extended-regexp: 使用扩展正则表达式。 这意味着你可以使用更复杂的模式匹配规则,例如 +, ?, |, () 等。

    grep -E "pattern1|pattern2" file.txt  #匹配包含 "pattern1" 或 "pattern2" 的行。
    
  • -F--fixed-strings: 将模式视为固定字符串,而不是正则表达式。 这可以提高搜索速度,尤其是在模式包含正则表达式特殊字符时。

    grep -F ".*" file.txt  # 将 ".*" 视为普通字符串,而不是正则表达式的通配符。
    
  • -o--only-matching: 只显示匹配的部分,而不是整行。

    grep -o "[0-9]\+" file.txt  # 只显示文件中的数字序列。
    
  • -A NUM--after-context=NUM: 显示匹配行及其后 NUM 行。

    grep -A 2 "pattern" file.txt #匹配行及随后的两行
    
  • -B NUM--before-context=NUM: 显示匹配行及其前 NUM 行。(就是你之前问的选项)

    grep -B 2 "pattern" file.txt #匹配行及其前面的两行
    
  • -C NUM--context=NUM: 显示匹配行及其前后 NUM 行。

    grep -C 2 "pattern" file.txt #匹配行及其前后的两行
    

示例:

  1. 在文件中搜索字符串:

    grep "example" myfile.txt  # 在 myfile.txt 中搜索包含 "example" 的行。
    
  2. 从标准输入搜索:

    cat myfile.txt | grep "example"  #  将 myfile.txt 的内容通过管道传递给 grep 进行搜索。
    
  3. 使用正则表达式:

    grep "^[A-Z].*\.txt$"  # 搜索以大写字母开头,以 ".txt" 结尾的行。
    
  4. 组合使用选项:

    grep -in "error" logfile.txt  # 忽略大小写,显示包含 "error" 的行及其行号。
    

正则表达式基础 (grep -E):

使用 -E 选项时,可以使用更复杂的正则表达式。 一些常用的正则表达式元字符包括:

  • . (点号): 匹配任意单个字符。
  • * (星号): 匹配前一个字符零次或多次。
  • + (加号): 匹配前一个字符一次或多次。
  • ? (问号): 匹配前一个字符零次或一次。
  • | (竖线): 逻辑 “或”,匹配多个模式中的任何一个。
  • () (括号): 用于分组,并可以用来捕获匹配的文本供后续引用。
  • [] (方括号): 匹配方括号中的任意一个字符。 例如,[abc] 匹配 a, bc
  • ^ (脱字符): 匹配行的开头。
  • $ (美元符): 匹配行的结尾。

使用总结:

grep 是一个非常强大的文本搜索工具,熟练掌握它的各种选项和正则表达式可以大大提高你在 Linux 命令行下的工作效率。记住,可以通过 man grep 命令查看 grep 的完整文档,了解所有可用的选项和更高级的用法。