【发布时间】:2023-04-03 14:23:01
【问题描述】:
我想用 sed 打印匹配模式,例如:
我想获得 uuid,所以我可以使用它:blkid $1 | grep -o -E "[a-f0-9-]{8}([a-f0-9-]{4}){3}[a-f0-9-]{12}"
我如何使用 sed 或 awk 做到这一点?
【问题讨论】:
我想用 sed 打印匹配模式,例如:
我想获得 uuid,所以我可以使用它:blkid $1 | grep -o -E "[a-f0-9-]{8}([a-f0-9-]{4}){3}[a-f0-9-]{12}"
我如何使用 sed 或 awk 做到这一点?
【问题讨论】:
sed
sed -n 's/pattern/&/p' file
-n 是告诉sed 保持安静,& 是匹配字符串,p 是打印。
awk
awk '/pattern/' file
在您的情况下,将pattern 更改为[a-f0-9-]{8}([a-f0-9-]{4}){3}[a-f0-9-]{12},可能需要使用\ 转义[。
【讨论】:
sed -n '/pattern/p' 完成这项工作 - 它执行“打印”而不是“替换为自己并打印”
你想要这个吗?
awk:
kent$ echo '/dev/sda6: UUID="c6e3ce88-f44e-4261-9178-042db8423081" TYPE="ext3"'|awk -F'UUID="|" ' '{print $2}'
c6e3ce88-f44e-4261-9178-042db8423081
sed:
kent$ echo '/dev/sda6: UUID="c6e3ce88-f44e-4261-9178-042db8423081" TYPE="ext3"'|sed -r 's/.*UUID="([^"]*).*"/\1/g'
c6e3ce88-f44e-4261-9178-042db8423081
【讨论】:
blkid | sed -nr 's/^.+UUID="(.*?)" .+$/\1/p'
【讨论】:
Awk 和 sed 解决方案:
$ blkid /dev/sda2 | sed -e 's/.*UUID="\([0-9A-F]*\).*/\1/'
16A42BA2A42B837B
$ blkid /dev/sda2 | awk '{split($2, tmp, "=") ; print tmp[2]}'
"16A42BA2A42B837B"
$ blkid /dev/sda2 | awk -F'UUID="|"' '{print $2}'
16A42BA2A42B837B
【讨论】:
使用 sed:
sed -n 's/.*\(Pattern\).*/\1/p'
测试
echo "
开始 "开始 echo "开始 " | sed -n 's/.(开始)./\1/p' 开始
【讨论】:
sed 有一个很好的列表 http://sed.sourceforge.net/sed1line.txt。它提出了两种模拟grep的方法:
sed -n '/regexp/p' # method 1
sed '/regexp/!d' # method 2
/regexp/p 打印匹配/regexp/ 的行。 (需要-n 标志来防止sed 打印/重新打印每个已处理的行。)
/regexp/!d 删除不 匹配/regexp/ 的每一行,因此只打印匹配的行。
【讨论】: