perl oneliner + 如何匹配位于文件的第一个/秒字段中的IP地址

perl oneliner + 如何匹配位于文件的第一个/秒字段中的IP地址

以下 perl oneliner 语法验证“$IP”中的 IP 地址是否与文件中的 IP 地址匹配

     perl -ne 'BEGIN{$IP=shift} print if /(^|\s)\Q$IP\E(\s|$)/;' $IP file

文件有两个字段

如下例

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
.
.
.

是否可以定义 perl 语法来匹配第一个字段或第二个字段中存在的 IP? - 如果是的话我需要改变我的语法吗?

例如(如果我们只想匹配第一个字段)

     perl -ne 'BEGIN{$IP=shift} print if /(^|\s)\Q$IP\E(\s|$)/;' 192.9.200.1 file

那么它应该匹配该行第一个字段中存在的 IP - 192.9.200.1:

   "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 语句提供自动chomping 和自动换行符。

awk 更简单:

awk -v ip=$IP '$1==ip || $2==ip' file

第二次阅读该问题表明您可能只想匹配第一列或仅匹配第二列。要将列号作为参数传递:

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

对于“有不止一种方法可以做到这一点”。 :-)

在第一列或第二列中查找 IP 地址的另一种方法是使用 grep。

对于第 1 列:

grep ^192.9.200.1 file

这会在第一列中输出包含您的 IP 的所有行。

对于第 2 列:

grep 192.9.200.1$ file

这将输出最后一列中包含您的 IP 的所有行。

我喜欢 Glenn 提出的使用 awk 来查看 IP 是否在第 1 列和第 2 列中的解决方案,它很好且可读。

相关内容