以下 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 语句提供自动chomp
ing 和自动换行符。
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 列中的解决方案,它很好且可读。