用制表作为分隔符的awk

时间:2014-07-07 14:02:57

标签: linux bash shell awk

我有以下输出

root@root# adsl info --state|grep "Upstream rate"
Max:    Upstream rate = 1120 Kbps, Downstream rate = 8948 Kbps
Bearer: 0, Upstream rate = 1021 Kbps, Downstream rate = 4095 Kbps

上述输出中的列表显示在

root@root# adsl info --state|grep "Upstream rate"
Max:<TAB>Upstream rate = 1120 Kbps, Downstream rate = 8948 Kbps
Bearer:<TAB>0, Upstream rate = 1021 Kbps, Downstream rate = 4095 Kbps

我想用awk解析上面的输出。分界符是制表符,

所以我试过

adsl info --state|grep "Upstream rate"| awk -F'[ ,]' '{ print $1}'

但它返回

Max:    Upstream
Bearer: 0

甚至

adsl info --state|grep "Upstream rate"| awk -F'[\t,]' '{ print $1}'

返回

Max:    Ups
Bearer: 0

我期待:

Max:
Bearer:

我想我必须在-F选项中添加制表分隔符。怎么做?

1 个答案:

答案 0 :(得分:4)

如果你的输入正如你告诉我们的那样,每行中的第一个空白区域都是一个制表符,这就是你用制表符或逗号分隔的字段所需要的:

$ awk -F'[\t,]' '{print "$0 =",$0; for (i=1;i<=NF;i++) print "\t$"i,"=",$i}' file
$0 = Max:       Upstream rate = 1120 Kbps, Downstream rate = 8948 Kbps
        $1 = Max:
        $2 = Upstream rate = 1120 Kbps
        $3 =  Downstream rate = 8948 Kbps
$0 = Bearer:    0, Upstream rate = 1021 Kbps, Downstream rate = 4095 Kbps
        $1 = Bearer:
        $2 = 0
        $3 =  Upstream rate = 1021 Kbps
        $4 =  Downstream rate = 4095 Kbps

在输入上运行上述命令并发布结果。您输入的替代方法不像您所说的那样,您的FS中的\t被视为普通t。我无法想象是什么导致这种情况(除非你在ssh下运行所有​​这些或者在它到达awk之前解释反斜杠的东西?)但是你需要找出你需要取得进展和运行的问题上面的命令以及输入的cat -v将告诉你究竟是什么问题。

我想知道你的awk是否坏了,因为你从繁忙的盒子里拿到工具而且我不知道他们的awk支持什么。试试这个:

$ awk -F'['$'\t'',]' '{print "$0 =",$0; for (i=1;i<=NF;i++) print "\t$" i, "=", $i}' file

它将使用FS中的文字制表符 - 也许这会产生影响。