文字列を検索し、同じawkコマンドで切り取ります。

文字列を検索し、同じawkコマンドで切り取ります。

ファイルがあります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の一致部分のみを印刷するように定義します。正規表現は-PPerl正規表現として解釈され、より多くのオプションを提供します。

正規表現は次のように言います。

  • ,()ではなく、[^,]+次に終わる他の文字を探してください。,
  • xyz= (?<=\bxyz=)これらの連続する文字は、正数と呼ばれるaの後になければなりません。後ろを見て)。私たちは\bgrepやそれに似たものをしないようにします。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] ","

関連情報