使用 awk 打印包含多个模式的列

使用 awk 打印包含多个模式的列

我需要用来awk打印包含多个模式的列。我需要打印第 2 列以及分别包含“config”和“service”的所有列。

文件内容:

    build 345 java groovy /test:fail.txt /config:launcher.mxres /nickname:prod /service:session 
    auto 4986 java -xmx512 -d64 /test:pass.txt /nickname:deal /service:engine /config:launcher5.mxres
    build 912 binary.exe -f -t /test:code.txt /config:launcher_binary.mxres /service:scanner /nickname:input 

输出:

    345 /config:launcher.mxres /service:session
    4986 /config:launcher5.mxres /service:engine
    912 /config:launcher_binary.mxres /service:scanner

答案1

以下awk脚本将遍历每行的字段(列)并查找/config:/service:字段。找到后,这些字段的完整内容存储在变量中。

处理完这些字段后,脚本将输出第二个字段中的数据以及循环中找到的字段。然后该过程继续输入下一行。

{
    config = service = "";

    for (i = 3; i <= NF; ++i) {
        if ($i ~ "^/config:") {
            config = $i;
        } else if ($i ~ "^/service:") {
            service = $i;
        }
    }

    print $2, config, service;
}

该脚本已经过测试并可与gawk(GNU awk)、mawk(Mike's awk) 和nawk(BSD awk) 一起使用。

对您提供的数据运行此命令:

$ awk -f script.awk data
345 /config:launcher.mxres /service:session
4986 /config:launcher5.mxres /service:engine
912 /config:launcher_binary.mxres /service:scanner

如果您想要制表符分隔的输出,请BEGIN { OFS = "\t" }在脚本顶部添加。

...或者您可以传递原始脚本的输出column -t(如果需要对齐列,将插入多个空格):

$ awk -f script.awk data | column -t
345   /config:launcher.mxres         /service:session
4986  /config:launcher5.mxres        /service:engine
912   /config:launcher_binary.mxres  /service:scanner

作为单行:

$ awk '{ config = service = ""; for (i = 1; i <= NF; ++i) { if ($i ~ "^/config:") { config = $i } else if ($i ~ "^/service:") { service = $i } } print $2, config, service }' data | column -t

相关内容