Linux 以表格作为分隔符的awk

Linux 以表格作为分隔符的awk,linux,bash,shell,awk,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" M

我有以下输出

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
但它又回来了

Max:    Upstream
Bearer: 0
甚至

返回

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中使用文本制表符-这可能会有所不同。

如果您的输入如您所说,每行中的第一个空格为制表符,则制表符或逗号分隔的字段将使用以下内容:

$ 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中使用文本制表符-这可能会有所不同。

一个简单的
awk'{print$1}'
将完成此任务。当你说
时,delimeters是制表符,
你的意思是制表符后面或前面有逗号的字符串是分隔符吗,或者你的意思是制表符或逗号是分隔符还是其他什么?如果您发布的输入版本中的制表符替换为“”或需要澄清的内容,这会有所帮助。@AvinashRaj print$1只是我想解析其他内容的一个示例fields@MOHAMED然后更新你的问题,以展示一个更有趣/更有意义的例子,说明你正在尝试做什么。你的输入并不像你告诉我们的那样。在
Max:
上游之间没有选项卡,在
Ups
tream
之间可能有选项卡,并且您的输入中可能有虚假的控制字符。对您的输入运行
cat-v
查看。一个简单的
awk'{print$1}'
就可以完成这项工作。当您说
delimeters是制表符,
您的意思是制表符后跟或后跟逗号的字符串是分隔符,还是制表符或逗号是分隔符或其他什么?如果您发布的输入版本中的制表符替换为“”或需要澄清的内容,这会有所帮助。@AvinashRaj print$1只是我想解析其他内容的一个示例fields@MOHAMED然后更新你的问题,以展示一个更有趣/更有意义的例子,说明你正在尝试做什么。你的输入并不像你告诉我们的那样。在
Max:
上游之间没有选项卡,在
Ups
tream
之间可能有选项卡,并且您的输入中可能有虚假的控制字符。在您的输入上运行
cat-v
,查看。我的cat受到限制,它来自忙框,它不包含-v选项
catv
,而不是
cat-v
。您是否尝试了我在上面的回答末尾建议的awk命令?如果那没用,恐怕你只能靠自己了;it’我试图猜测“忙盒”上有/没有哪些工具,哪些工具可能正常工作,哪些可能不正常。我的cat受到限制,它来自忙盒,它不包含-v选项
catv
,而不是
cat-v
。您是否尝试了我在上面的回答末尾建议的awk命令?如果那没用,恐怕你只能靠自己了;It’我试图猜测“忙盒”上有/没有哪些工具,哪些工具可能正常工作,哪些工具可能不正常工作,这是毫无意义的。
$ 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
$ awk -F'['$'\t'',]' '{print "$0 =",$0; for (i=1;i<=NF;i++) print "\t$" i, "=", $i}' file