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
答え2
ip=1.1.1.2; sed -ne "/,${ip//./\\.}\$/=" yourIPfile
ドットをエスケープして一致する行番号を表示する.
sedコマンドに入力します。=
答え3
いつでも以前のバージョンを試すことができますgrep
。
grep -wFn 1.1.1.2 yourIPfile
または
ip=1.1.1.2 ; grep -wFn $ip yourIPfile
どちらの場合も、出力は次のようになります。
1:node2,1.1.1.2