Perl oneliner +ファイルの最初の/ secフィールドのIPアドレスを一致させる方法

Perl oneliner +ファイルの最初の/ secフィールドのIPアドレスを一致させる方法

次の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

-lprintステートメントに自動chompingと自動改行機能を提供します。

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のソリューションが好きです。素晴らしいと読みやすいです。

関連情報