我想使用sed提取括号旁边的字符串。例如,以下是/ proc / mdstat的输出,它的驱动器发生故障,由(F)表示。
cat /proc/mdstat | grep 'F'
md2 : active raid1 nvme0n1p3[0](F) nvme1n1p3[1]
我要提取驱动器nvme0n1p3,该驱动器旁边有一个后缀(F)。我尝试使用awk和cut,但是发生故障的驱动器的位置发生了变化,在这种情况下,awk和cut无法正常工作。因为正则表达式对我来说似乎很复杂,所以有人可以帮我这个忙。
答案 0 :(得分:1)
以下是在正则表达式扩展模式下使用sed
的解决方案:
echo "md2 : active raid1 nvme0n1p3[0](F) nvme1n1p3[1]" |
sed -E 's/^.* (\S+)\[[[:digit:]]+\]\(F\).*$/\1/'
这将输出:
nvme0n1p3
以下是所使用模式的说明:
^ from the start of the input
.* consume anything, up until the last
[ ] single space, followed by
(\S+) series of non whitespace characters (captured)
\[[[:digit:]]+\] which are followed by '[0]', a number in square brackets
\(F\) followed by '(F)'
.* then consume the rest of the input
$ end of input
然后我们用\1
代替,它是从正则表达式模式中捕获的(\S+)
数量,应该是您要查找的数量。
答案 1 :(得分:1)
您可以使用一次对awk
的调用(请注意,您不需要cat
,只需将文件直接传递到awk
即可)
awk -F'[][():[:space:]]+' '/\(F\)/{print $4}' /proc/mdstat
-F'[][():[:space:]]+'
将字段分隔符设置为与1个或多个]
,[
,(
,)
,:
匹配的正则表达式或空白字符。因此,您将获得的字段将是[md2, active, raid1, nvme0n1p3, 0, F, nvme1n1p3, 1]
,如您所见,您的值在字段4中。
我还在F
周围添加了括号检查,可能会使行搜索更安全。
s="some line 1
md2 : active raid1 nvme0n1p3[0](F) nvme1n1p3[1]
last line"
awk -F'[][():[:space:]]+' '/\(F\)/{print $4}' <<< "$s"
# => nvme0n1p3