grep

概述

参考:

grep 是文本搜索工具,可以使用正则表达式在文件内查找符合条件的字串行

Syntax(语法)

grep [OPTIONS] PATTERNS [FILE…]

grep 根据 PATTERNS(模式) 过滤给定的内容。其实就是使用正则表达式,过滤内容。

OPTIONS

Pattern Syntaz(模式语法)

用于定义过滤时所解析的正则表达式语法

  • -E, –extended-regexp # 将 PATTERNS 解释为扩展的正则表达式(ERE,请参见下文)。
  • -P,–perl-regexp # 将 PATTERNS 解释为与 Perl 兼容的正则表达式(PCREs)。与-z(–null-data)选项结合使用时,此选项是实验性的,并且 grep -P 可能会警告未实现的功能。

Matching Control(配置控制)

  • -i # 忽略大小写
  • -v, –invert-match # 反向选择,选择没有要匹配的字符串的行

General Output Control(通用输出控制) 选项

  • -c, –count # 计算找到的符合行的次数
  • –color=auto # 把查找到内容自动表上默认颜色,auto 可改成别的颜色英文
  • -l,–files-with-matches # 只输出匹配到的文件的文件名。常用来在一堆文件中,筛选指定内容,只查看哪些文件有指定的内容。
  • -m, –max-count=NUM # 在 NUM 个匹配行后停止读取文件。i.e.
  • -o, –only-matching # 仅显示被匹配到的字符串,不显示整行
  • -s, –no-messages # 不显示错误信息

Output Line Prefix Control(控制输出行的前缀)

  • -h, –no-filename # 当过滤多个文件时,不要输出文件名,仅输出过滤到的内容。
  • -n, –line-number # 顺便输出行号

Context Line Control(控制输出内容的上下行)

  • -A NUM, –after-context=NUM # 打印出查找到的行的下面 NUM 行
  • -B NUM, –before-context=NUM # 打印出查找到的行的上面 NUM 行
  • -C NUM, –context=NUM # -A 与 -B 选项的结合体,控制输出内容的 上面 和下面 NUM 行

File and Directory Selection(文件和目录选择)

  • -a, –text # 像对待文本一样处理二进制文件;这等效于–binary-files = text 选项。
  • –exclude FILE # 跳过指定文件,不让 grep 处理跳过的文件。可以使用通配符。
  • –exclude-dir=DIR # 跳过指定目录,不让 grep 处理跳过的目录。可以使用通配符。
  • -R, –dereference-recursive # 递归地阅读每个目录下的所有文件并进行 grep 操作;该选项相当于-d recurse

EXAMPLE

  • 查看 accesslog 文件的实时更新,并筛选出不包含两个字符串的行
    • tailf accesslog | grep -vE ‘(miguvideo|mgtv)’
  • grep –color=auto -i R.*h ./boot.log | grep -Evi “star|net” # 不区分大小写搜索 boot.log 文件中包含 Rh 中间含有任意字符的,并且不包含 Star 或 net 的所有行,并以高亮颜色显示搜索的字符串,|表示或的关系,正则表达式扩展内容,选项必须有 E 才能生效。
  • grep -i ‘/bin/bash’ /etc/passwd | sort -n -t: -k3 | tail -1|cut -d: -f1 # 取出默认 shell 为 bash 且其 ID 号最大的用户
  • grep “^#[[:space:]]{1,}[^[:space:]]{1,}” /etc/X # 取出/etc/x 文件中井号开头后最少一个空白字符后最少一个非空白字符的行
  • ifconfig | egrep –color=auto -n ‘[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}’
  • egrep –color=auto -n ‘[0-9]+.[0-9]+.[0-9]+.[0-9]+’ # 匹配 ifconfig 中的所有 IP 地址,带匹配高亮,带行号(egrep 就是 grep -E)
  • egrep –color=auto -n ‘<[0-9]{2}>.[0-9]+.[0-9]+.[0-9]+’ # 可以搜索第一段是两位数的 IP,比如 10.0.0.0 网段
  • grep -i –color=auto ‘[0-9]+.[0-9]+.[0-9]+.[0-9]+’ ./interfaces # 不适用 egrep 的方法

应用示例

多个字符串逐一匹配多个文件,匹配到的话,输出字符串与所在文件

#!/bin/bash
#
CMD_ID="10385455 10385631 10385269 10385176 10385362 10385734 10385920 10385083 10384897 10384764 10384618 10384153 10384339 10384246 10384525 10383781 10383967 10383595 10383315"
for id in $CMD_ID; do
    matched_files=$(grep -l -r --exclude=test.sh --exclude-dir=scripts "$id" /PATH/TO/DIR/*)
    if [ -n "$matched_files" ]; then
        echo "ID ${id} matched in: ${matched_files}"
    else
        echo "ID ${id} not found"
    fi
done

筛选 {{ }} 之间的内容

hi,hello {{A1}}
{{B0B}}test{{CC_CC}}
@{{D-DD}}
{{E#@EEE}}

筛选后文本

cat content.txt | grep -oP "(?<={{)(\w|-|#|@)+(?=}})"

A1
B0B
CC_CC
D-DD
E#@EEE

cat content.txt | grep -oE “{{(\w|-|#|@)+}}”

cat content.txt | grep -oP “{{(\w|-|#|@)+}}”

{{A1}}
{{B0B}}
{{CC_CC}}
{{D-DD}}
{{E#@EEE}}

最后修改 July 18, 2024: gitlab (a4050913)