grep - xxooxxooxx/xxooxxooxx.github.io GitHub Wiki
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'