awkマッチングの問題

awkマッチングの問題

awkを使用して正確な文字列を一致させるのに問題があります。

私の目的は、CSVで一致を検索し、その一致の行番号を取得することです。したがって、以下のファイルから「1.1.1.2」を検索すると、「1」が返されたくなります。

CSV

[apache@JBLAMPS001 tmp]$ cat test.csv
node2,1.1.1.2
node20,1.1.1.20
node21,1.1.1.21
node22,1.1.1.22
node102,1.1.1.102
node202,1.1.1.202

私が試したこと

[apache@JBLAMPS001 tmp]$ awk '/'1.1.1.2'/ {print NR}' test.csv
1
2
3
4
5
6

[apache@JBLAMPS001 tmp]$ awk '/\y'1.1.1.2'\y/ {print NR}' test.csv
1
5

[apache@JBLAMPS001 tmp]$ awk '"^1.1.1.2$" {print NR}' test.csv
1
2
3
4
5
6

私はこれをどうやって作ることができるか知っている人はいますか?ありがとうございます。

ベストアンサー1

正規表現を使用するには、適切な修飾子とアンカーを使用して必要な一致のみを取得する必要があります。あなたの場合、正規表現パターン1.1.1.2.単一文字を意味する)はすべての行と一致して結果を得ます。最後はawk '"^1.1.1.2$" {print NR}'正規表現パターンを入れる方法ではありません。 orをawk使用する必要があります。//$<field> ~ <pattern>


希望の結果を得る方法は次のとおりです。

  • 正規表現の方法:文字通り.処理するには、すべてのsをエスケープして一致の$末尾に追加します。

    awk '/1\.1\.1\.2$/ {print NR}' test.csv
    
  • ,文字列操作:後ろに水平スペースで区切られた最後のフィールドがある場合は、レコード番号を印刷します1.1.1.2

    awk -F ',[[:blank:]]*' '$NF == "1.1.1.2" {print NR}' test.csv 
    

おすすめ記事