grep - xxooxxooxx/xxooxxooxx.github.io GitHub Wiki

系列命令有四个,分别是 grep egrep fgrep rgrep

grep [options] PATTERN [FILE...]
-i 忽略大小写
--color 显示颜色
-v 显示没有被模式匹配到的行
-o 只显示被模式匹配到的字符串,默认是显示被模式匹配到的行
-e 指定一个或多个搜索模式,并且忽略以字符 - 开头的搜索模式,以避免被错误的解释为命令选项。
-E 扩展正则表达式,等价于 egrep ,在 GNU grep 中功能与基本正则表达式没有差别,只是模式中的元字符不在需要反斜线 \
fgrep 不支持正则表达式,适合嵌入式设备,占用cpu时钟少。
rgrep 支持递归。

基本正则表达式以及元字符:REGular EXPression, REGEXP

单个字符:

  • . 匹配任意单个字符
    grep 'r..t' file.txt

  • [ ] 匹配指定范围内的任意单个字符

  • [^ ] 匹配指定范围外的任意单个字符,即取反

  • 字符集
    [:alnum:] 匹配任意一个字母或者数字,等价于 [:alpha:] 和 [:digit:] 也可以写做 [0-9A-Za-z]
    [:alpha:] 匹配任意一个字母,等价于 [A-Za-z]
    [:blank:] 匹配 space and tab
    [:cntrl:] 匹配一个控制字符,等价于八进制的 000-037, 和 177 (DEL)
    [:digit:] 匹配任意一个数字,等价于 [0-9]
    [:graph:] 匹配一个看的见的字符,等价于 [:alnum:] 和 [:punct:]
    [:lower:] 匹配任意一个小写字母,等价于 [a-z]
    [:print:] 匹配一个可以打印的字符,等价于 [:alnum:], [:punct:] 和 space
    [:space:] 匹配一个空白字符,包括空格、制表符、垂直制表符、换行、回车、分页符
    [:upper:] 匹配任意一个大写字母,等价于 [A-Z]
    [:xdigit:] 匹配一个十六进制数字,即 [0-9a-fA-F]
    [:punct:] 匹配一个特殊符号 包含这些字符(见下)
    \w 等价于[ [:alnum:] ]
    \W 等价于[ ^[:alnum:] ] 或者 [ [:punct:] ]

! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~.

匹配次数:

  • * 匹配其前面的字符任意次
    grep 'a*b' file.txt
    grep 'a.*b' file.txt 任意长度的任意字符

  • \? 匹配其前面的字符 0 次或 1 次(基本正则表达式元字符 ?、+、 {、|、 ( 和 ) 已经失去了它们原来的意义,要使用的话用反斜线的版本 \?、\+、\{、\|、\( 和 \) 来代替。)
    grep 'a\?b' file.txt

  • \+ 匹配其前面的字符最少1 次
    grep 'a\+b' file.txt

  • \{m,n\} 匹配前面的字符至少 m 次,至多 n 次。
    grep 'a\{2\}b' file.txt 匹配 a 2 次
    grep 'a\{1,\}b' file.txt 匹配 a 最少 1 次,最多不限
    grep 'a\{1,3\}b' file.txt 匹配 a 最少 1 次,最多 3 次

位置锚定:

  • ^ 锚定行首,此字符后面的任意内容必须出现在行首
    grep '^root' /etc/passwd

  • $ 锚定行尾,此字符前面的任意内容必须出现在行尾
    grep 'sh$' /etc/passwd
    grep '^$' /etc/config/fstab | wc -l 统计文件里空白行的行数

  • \< 或者 \b 锚定词首,其后面的任意字符必须做为单词首部出现
    \> 或者 \b 锚定词尾,其前面的任意字符必须做为单词尾部出现
    也可理解为匹配单词首尾的空格等特殊字符
    grep '\<root' /etc/passwd
    grep 'root\>' /etc/passwd
    grep '\broot\b' /etc/passwd 或者 grep '\<root\>' /etc/passwd

  • \B 匹配非单词边界
    123\B 能匹配 0123456 中的 123,但不能匹配 0123 中的 123

分组,后向引用和逻辑或:

  • \( \) 分组,可以嵌套
    grep '\(ab\)\{1,\}' file 匹配ab最少出现1次

  • \1 \2 \3 ... 后向引用
    \1 第一个左括号以及与之对应的右括号所包括的所有内容
    \2 第二个左括号以及与之对应的右括号所包括的所有内容
    ...
    grep '\(a.b\)\.\1' file 匹配axb.axb
    注, a.b 中的.为任意一个字符,引用 \1 时,引入的为第一次 a.b 匹配的字符分组。
    比如 a.b 第一次匹配到的为 a9b 那么\1 匹配的也为 a9b ,其它字符,比如 a8b 不会匹配。

  • 逻辑或\|
    grep --color '123\|aa' file 匹配123或者aa,逻辑或的操作符|作用于两边所有。如果要匹配单个字符,请使用( )
    grep --color '12\(3\|a\)a' file 匹配123a或者12aa

列子:

  • 匹配以数字结尾的行
grep "[[:digit:]]$" file.txt
  • 获取系统所有绑定ip列表
ip addr show | grep '\binet\b.*\/[[:digit:]]\{1,2\}.*\bscope[[:space:]]global\b.*' | awk '{print $2}' | cut -d "/" -f 1 >iplist
  • 自动更新 TLSA records 的脚本,配合letsencrypt证书
sudo apt-get update && sudo apt-get install hash-slinger -y
#!/bin/sh
#
source /etc/profile
DN="www.xyz"
FP="/etc/bind/db.$DN"
CF="/etc/letsencrypt/live/$DN/fullchain.pem"
S=`tlsa --create --selector 1 --certificate $CF $DN 2>/dev/null | grep -o '\b[[:alnum:]]\{64\}$'`
[ $? -eq 0 ] && sed -i "/.*\bTLSA\b.*/{s/\b[[:alnum:]]\{64\}$/$S/}" $FP ||  (echo error!;exit 99)

https://learn.microsoft.com/en-us/purview/how-smtp-dane-works

  • 匹配一个合法的 IPv4 地址
    A: 1-127
    B: 128-191
    C: 192-223
ifconfig | egrep -o --color '([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\.'
ifconfig | egrep -o '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>' | grep -v '127\.0\.0\.1'
⚠️ **GitHub.com Fallback** ⚠️