我需要用来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