
ファイルがありますabc.txtこのような資料があります -
abc pqr testing, xyz=a432j42jjk4, key=124
abc pqr testing, xyz=jkl234j54nn, key=567
abc pqr testing, xyz=2395hdshkw4, key=3232
abc pqr testing, xyz=abc424729hh, key=7676
abc pqr testing, xyz=70700ghgh99, key=12342
私はawkを使って次のような「xyz」テキストを検索しています。
awk -F"xyz=" '{print $2}' abc.txt | awk '{print $1}'
これは私に新しいラインで出力を与えます -
a432j42jjk4,
jkl234j54nn,
2395hdshkw4,
abc424729hh,
70700ghgh99,
awkから改行文字を削除しながら出力を取得できるショートカットやトリックを探しています。
答え1
GNU を使用してgrep
以下を実装します。
$ grep -o -P '(?<=\bxyz=)[^,]+,' abc.txt
grep
与えられた正規表現に一致する行を印刷します。行-o
の一致部分のみを印刷するように定義します。正規表現は-P
Perl正規表現として解釈され、より多くのオプションを提供します。
正規表現は次のように言います。
,
()ではなく、[^,]+
次に終わる他の文字を探してください。,
xyz=
(?<=\bxyz=)
これらの連続する文字は、正数と呼ばれるaの後になければなりません。後ろを見て)。私たちは\b
grepやそれに似たものをしないようにします。booxyz=
答え2
組み込みの一致機能を使用すると、awk
コマンドをさらに簡素化できます。
$ awk -F ',' '/xyz=/ {split($2,a,"="); print a[2]}' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99
これは、後で空の行を削除するためにこのステートメントを使用する必要がないように、埋め込み行を一致させるためにawk
使用します。xyz=
if
ロジックが左から右に流れるので、読みやすく見えます。
xyz=
このソリューションは、カンマ区切りファイルの2番目のフィールドではなく、フィールドで発生する状況を防ぎません。
答え3
基準を使用awk
して探したいとします。xyz=
具体的に2番目のカンマ区切りフィールドにあります。
$ awk -F ',' '{ split($2,a,"="); if (a[1] == " xyz") print a[2] }' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99
または、
$ awk -F ',' '{ split($2,a,"=") } a[1] == " xyz" { print a[2] }' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99
これは、入力をカンマ区切りのフィールドを含む行で構成されるものとして扱います。コードの実際の本文は、カンマでawk
区切られた2番目のフィールドを上記のサブフィールドに分割し、最初のフィールドが文字=
列(カンマの前の最初のスペースを含む)の場合、xyz
その中の2番目のフィールドを印刷します。
a[1]
空の行はその行から必要な値を取得できないため、削除されます。
各出力行の末尾に追加のカンマを追加するには、を使用しますprint a[2] ","
。