次のPerl oneliner構文は、「$ IP」のIPアドレスがファイルのIPアドレスと一致することを確認します。
perl -ne 'BEGIN{$IP=shift} print if /(^|\s)\Q$IP\E(\s|$)/;' $IP file
ファイルには2つのフィールドがあります。
次の例のように
more file
192.9.200.1 172.19.2.100
10.23.1.10 34.12.0.1
45.2.11.1 192.9.200.1
.
.
.
最初のフィールドまたは2番目のフィールドのIPと一致するようにPerl構文を定義することは可能ですか? - では、構文を変更する必要がありますか?
たとえば(最初のフィールドのみを一致させたい場合)
perl -ne 'BEGIN{$IP=shift} print if /(^|\s)\Q$IP\E(\s|$)/;' 192.9.200.1 file
次に、行の最初のフィールドである192.9.200.1のIPと一致する必要があります。
"192.9.200.1 172.19.2.100"
答え1
私はPerlの「自動分割」オプションを使います。-a
正規表現を遠ざける
perl -lane 'BEGIN{$IP=shift} print if $F[0] eq $IP or $F[1] eq $IP' $IP file
perl -lane 'BEGIN{$IP=shift} print if grep {$_ eq $IP} @F[0,1]' $IP file
-l
printステートメントに自動chomp
ingと自動改行機能を提供します。
awkはもっと簡単です。
awk -v ip=$IP '$1==ip || $2==ip' file
質問を 2 番目に読み取ると、最初の列だけを一致させるか、2 番目の列だけを一致させたい場合があります。列番号をパラメータとして渡すには:
perl -lane '
BEGIN {($IP,$col) = splice @ARGV,0,2}
print if $F[$col-1] eq $IP
' $IP 2 file
awk -v ip=$IP -v col=2 '$col == ip' file
サンプルデータが与えられると、以下が返されます。
45.2.11.1 192.9.200.1
答え2
「これを行う方法はいくつかあります。」 :-)
最初または2番目の列でIPアドレスを見つけるもう1つの方法は、grepを使用することです。
列1の場合:
grep ^192.9.200.1 file
これにより、最初の列にIPを含むすべての行が出力されます。
列2の場合:
grep 192.9.200.1$ file
これにより、最後の列にIPを含むすべての行が出力されます。
私はIPが列1と2にあることを確認するためにawkを使用するGlennのソリューションが好きです。素晴らしいと読みやすいです。