Grep テキスト一致パターン

Grep テキスト一致パターン

条件に一致する行の選択された部分を印刷するコマンドを探しています。たとえば、私のテキスト行は次のようになります。

p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X

Yこの例で予想される結果はですp2,p6

答え1

以下では、Perl準拠の正規表現を使用してくださいgrep

grep -Po '..(?==Y)' <file

結果:

p2
p6

答え2

この試み:

echo 'p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X' | grep -o '[^|]*=Y' | cut -d= -f1 | sed -e 'N;s/\n/,/g'

出力:

p2,p6

答え3

awk選択した正規表現区切り記号に基づいてレコードを読み取ることができます。たとえば、'[|\n]'
選択した区切り文字に従ってレコードをフィールドに分割することもできます。例えば。'='
三項演算子は(condition)?:先行カンマを防止します。

awk -F= -vRS='[|\n]' '$2=="Y"{ printf (i?",":"")"%s", $1; i=1 }'

出力:

p2,p6

末尾の改行が必要な場合は、END{}セクションに追加できます。一致するものがない場合に改行文字が出力されないようにするには、ORS出力レコード区切り文字()を最初に次のように設定できます。まったくを選択し、\n一致するものがあるかどうかを設定します。

awk -F= -vRS='|' -vORS= '$2=="Y"{printf (ORS?",":"")"%s", $1; ORS="\n"} END{print ""}'

答え4

シンプルなawk

awk -F\| '{for (i=1 ; i<= NF; i++) 
    if ( $i ~/Y/ ) { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}}'

どこ

  • -F\||区切り文字として使用
  • {for (i=1 ; i<= NF; i++) スキャンパターン
  • if ( $i ~/Y/ )見つかったら
  • { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}分割と印刷

出力

in 3 : p2
in 11 : p6

printf "%s\n",A[1]パターン番号をスキップするために使用されます。

関連情報