正则表达式字符
特殊字符 ^$[].*\?+{}|()
(在 sed 中使用 ?+{}|()
需要转义符 \
)
字符 | 功能 | 匹配实例 | 不匹配实例 |
---|---|---|---|
^ | 行首 | echo "book is" | sed -n '/^book/p' | echo "a book" | sed -n '/^book/p' |
$ | 行尾 | echo "a book" | sed -n '/book$/p' | echo "book is" | sed -n '/book$/p' |
^$ | 行首和行尾 | echo "book" | sed -n '/^b.*k$/p' | echo "a book" | sed -n '/^b.*k$/p' |
删除空白行 | sed '/^$/d' file | ||
[] | 字符组 | echo "book" | sed -n '/[bc]ook/p' | echo "book" | sed -n '/[ac]ook/p' |
[^] | 排除型字符组 | echo "book" | sed -n '/[^ac]ook/p' | echo "book" | sed -n '/[^ab]ook/p' |
[] | 区间 | echo "book" | sed -n '/[a-z]ook/p' | echo "book" | sed -n '/[A-Z]ook/p' |
. | 任意单个字符 | echo "book" | sed -n '/b..k/p' | echo "book" | sed -n '/b.k/p' |
* | 0次或多次 | echo "book" | sed -n '/bo*k/p' | echo "book" | sed -n '/ba*k/p' |
? | 0次或1次 | echo "book" | sed -n '/b\?k/p' | echo "book" | sed -n '/bo\?k/p' |
+ | 1次或多次 | echo "book" | sed -n '/bo\+k/p' | echo "book" | sed -n '/booo\+k/p' |
{m} | m次 | echo "book" | sed -n '/bo\{2\}/p' | echo "book" | sed -n '/bo\{3\}/p' |
{m,n} | 至少m次,至多n次 | echo "book" | sed -n '/bo\{1,2\}/p' | echo "book" | sed -n '/bo\{3,4\}/p' |
| | 逻辑OR | echo "book" | sed -n '/book\|look/p' | echo "book" | sed -n '/cook\|look/p' |
() | 表达式分组 | echo "book" | sed -n '/\(ok\)\+/p' | echo "book" | sed -n '/\(ak\)\+/p' |
查找字符串 grep
如果只是查找是否包含“字符串”,使用 grep 是合适的。
ps | grep ppp
查找 ppp 进程ifconfig | grep ppp
查找 ppp 端口
更多 grep 用法请链接快速查找 grep 常用命令
带分隔符 awk
如果字符串有“分隔符”--空格,冒号,逗号等,那么使用 awk 是合适的。
实例1 提取 IP 和 MAC 地址
ifconfig enp2s0 | awk '/inet /{print $2}'
锚定词=inet
IP 位于第 2 列ifconfig enp2s0 | awk '/ether/{print $2}'
锚定词=ether
MAC 位于第 2 列
实例2 基于 MAC 地址生成 EUI
ifconfig enp2s0 | awk '/ether/{print $2}' | awk -F: '{print $1$2$3"fffe"$4$5$6}'
分隔符=:
在 1~6 列中间插入fffe
更多 awk 用法请链接快速查找 awk 常用命令
任意字符串 sed
如果字符串没有明显的分隔符,那么使用 sed 是合适的。
实例 提取 ping 成功率
ping -c 1 -w 1 8.8.8.8 | sed -n 's/.*received, \([0-9]\{1,3\}\)%.*/\1/p'
前锚定词='received, ',后锚定词='%',目标=[0-9]{1,3},因为 sed 使用'()'定义子模式,使用'\1'提取子模式
特别留意:在 sed 中使用 ?+{}|()
需要转义符 \
更多 sed 用法请链接快速查找 sed 常用命令
替换字符串 sed
如果需要从文件中替换字符串,那么使用 sed 是合适的。
实例 修改文件中的 IP 地址
sed -i "s/\(.*\"ipaddr\": \"\)\([0-9.]*\)\(\",\)/\1$IP\3/" ./ip.json
子模式1=' "ipaddr": "' 正则表达式=.*"ipaddr": "
子模式2='192.168.1.99' 正则表达式=[0-9.]*
子模式3='",' 正则表达式=",
因为 sed 使用'()'定义子模式,使用'\1\2\3'提取子模式 1 2 3
特别留意:在 sed 中使用 ?+{}|()
需要转义符 \
,另外调用 $IP 变量 sed 需要使用"双引号"而不是“单引号”