在bash脚本中从单行获取单独的k,v字段

时间:2012-03-11 15:44:05

标签: shell command-line awk grep

我以这种形式阅读了一行数据:

KEYNAME:value,KEYNAME:value,KEYNAME:value

(请注意键是没有空格的字符串,值是整数)

我需要选择一些特定的键(不知道它们的相对位置)并在不同的行上打印它们的值:

value
value
value

到目前为止,我开始将输入行转换为多个KEY:值行,按下我想要的键,强加一个已知的顺序,最后通过cut再次删除关键部分:

sed 's/,/\n/g' | egrep '(FooKey|BarKey|BazKey)' | sort | cut -d':' -f2

我以为我可以用awk安排一些东西,其中我只知道基础知识,但我只能通过它们的位置顺序来管理字段而不是它们的名字(键名)。

可以使用其他语言(即Python或Perl)完成,但我将其作为练习,使用通常的shell工具完成所有操作。此外,我仍然更喜欢上面的解决方案来加载像python或perl这样的更大的解释器。

2 个答案:

答案 0 :(得分:1)

这将仅打印值:

awk 'BEGIN { RS=","; FS=":" } { print $2 }'

如果您希望按特定顺序排列值,可以将它们放在数组中:

awk '
    BEGIN { RS=","; FS=":" }
    { values[$1] = $2 }
    END {
        print values["FooKey"];
        print values["BarKey"];
    }'

答案 1 :(得分:1)

awk 'BEGIN { FS=":"; RS = ","; } /FooKey|BarKey|BazKey/ { print $1 }'