linux - 在处理命令输出中的空列时获取第 6 列

标签 linux awk

尝试从第 1 列值与字符串匹配的行的输出中获取第 6 列值。代码因空格而中断。

尝试将结果通过管道传输到 awk,但我该如何处理空格?

命令 | awk '$1=="string_to_match"{print $6}

NAME                        ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
tensorflow-123456-111111    asu-bsu-b   n1-standard-4               00.111.0.1   00.11.2.345  RUNNING
tensorflow-123456-222222    asu-bsu-b   n1-standard-4  True         00.111.0.2   11.11.3.345  RUNNING

我希望通过名称匹配获得外部 IP。

command | awk '$1=="tensorflow-123456-111111" {print $6}
RUNNING
// Want 00.11.2.345
command | awk '$1=="tensorflow-123456-222222" {print $6}
11.11.3.345

每个字段值都是一个可变长度的字符串。

最佳答案

考虑到您更新后的问题,对于您的特定情况没有必要,但如果将来有人遇到类似问题 - 通常使用 GNU awk 处理 FIELDWIDTHS 的列标题中没有空格的固定宽度输入数据:

$ cat tst.awk
NR==1 {
    nf = split($0,flds,FS,seps)
    for (i=1; i<=nf; i++) {
        FIELDWIDTHS = (i>1 ? FIELDWIDTHS " " : "") length(flds[i]seps[i])
    }
}
{
    for (i=1; i<=NF; i++) {
        val = $i
        sub(/\s+$/,"",val)
        print NR, i, "<" val ">"
    }
    print "---"
}

.

$ awk -f tst.awk file
1 1 <NAME>
1 2 <ZONE>
1 3 <MACHINE_TYPE>
1 4 <PREEMPTIBLE>
1 5 <INTERNAL_IP>
1 6 <EXTERNAL_IP>
1 7 <STATUS>
---
2 1 <tensorflow-123456-111111>
2 2 <asu-bsu-b>
2 3 <n1-standard-4>
2 4 <>
2 5 <00.111.0.1>
2 6 <00.11.2.345>
2 7 <RUNNIN>
---
3 1 <tensorflow-123456-222222>
3 2 <asu-bsu-b>
3 3 <n1-standard-4>
3 4 <True>
3 5 <00.111.0.2>
3 6 <11.11.3.345>
3 7 <RUNNIN>
---

关于linux - 在处理命令输出中的空列时获取第 6 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55941969/

相关文章:

unix - 在unix中分隔段落

android - 从命令行删除持久僵尸进程

linux - 想要 grep 行中的特定单词并在文件中的该行下方添加一个新行

linux - 如何使用期望脚本登录远程计算机时跳过横幅?

awk match() 多重匹配

awk - 如何用 '*' 替换所有中间字符?

bash - 按列合并文本文件 : two column common and append third column form all files

linux - 如何使用 awk 按分隔符拆分文件并通过管道传输到另一个脚本中?

java - 现代 linux 中 linux 关机/注销 TERM 信号处理程序的时间容差是多少?

c - 如何创建低级目标文件?