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:
。見つかったら、これらのフィールドの内容全体が変数に保存されます。
これらのフィールドを処理した後、スクリプトはループ内で見つかったフィールドだけでなく、2番目のフィールドのデータも出力します。その後、プロセスは次の行に進みます。
{
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