我有以下输出

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解析上面的输出。Delimeters是制表的,
所以我试着
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选项中添加制表分隔符。怎么做?

最佳答案

如果您的输入是如您所说的,每行的第一个空格是制表符,那么这就是您对制表符或逗号分隔字段的要求:

$ 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下运行所有这些,或者在反斜杠出错之前解释反斜杠?)但是您需要找出需要解决的问题,并运行上面的命令和输入的cat -v将确切地告诉您问题是什么。
我想知道你的awk是否坏了,因为你正在从busy box获得工具,我不知道他们的awk支持什么。试试这个:
$ awk -F'['$'\t'',]' '{print "$0 =",$0; for (i=1;i<=NF;i++) print "\t$" i, "=", $i}' file

它将在fs中使用一个文本制表符-也许这会有所不同。

关于linux - 用制表符作为分隔符的awk,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24612464/

10-12 22:42