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
次の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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加