使用sed根据括号提取字符串

时间:2019-10-03 05:52:43

标签: sed

我想使用sed提取括号旁边的字符串。例如,以下是/ proc / mdstat的输出,它的驱动器发生故障,由(F)表示。
cat /proc/mdstat | grep 'F' md2 : active raid1 nvme0n1p3[0](F) nvme1n1p3[1]

我要提取驱动器nvme0n1p3,该驱动器旁边有一个后缀(F)。我尝试使用awk和cut,但是发生故障的驱动器的位置发生了变化,在这种情况下,awk和cut无法正常工作。因为正则表达式对我来说似乎很复杂,所以有人可以帮我这个忙。

2 个答案:

答案 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周围添加了括号检查,可能会使行搜索更安全。

Online test

s="some line 1
md2 : active raid1 nvme0n1p3[0](F) nvme1n1p3[1]
last line"
awk -F'[][():[:space:]]+' '/\(F\)/{print $4}' <<< "$s"
# => nvme0n1p3