如何只匹配主机文件中的两个第一台主机

时间:2014-12-08 08:09:28

标签: linux bash perl awk sed

使用以下egrep命令我从/ etc / hosts文件中获取主机,如以下示例所示

egrep "Solaris|linux|unix|vms|win|proxy|terminal|unixware" /etc/hosts

192.9.200.12 Solaris1
192.9.200.13 Solaris2
192.9.200.14 Solaris3
192.9.200.15 Solaris4
192.9.200.16 Solaris5
192.9.200.17 linux1
192.9.200.18 linux2
192.9.200.19 linux3 
192.9.200.20 linux4
192.9.200.21 linux5

我想要的是添加awk或sed或perl one liner命令,它将仅打印两个第一个匹配主机,如下所示

egrep "Solaris|linux|unix|vms|win|proxy|terminal|unixware" | ...... /etc/hosts

192.9.200.12 Solaris1
192.9.200.13 Solaris2
192.9.200.17 linux1
192.9.200.18 linux2

4 个答案:

答案 0 :(得分:9)

从命令行使用perl,

perl -ne'
  print if /(Solaris|linux|unix|vms|win|proxy|terminal|unixware)/ && ++$s{$1}<=2;
' /etc/hosts

输出

192.9.200.12 Solaris1
192.9.200.13 Solaris2
192.9.200.17 linux1
192.9.200.18 linux2

答案 1 :(得分:2)

by awk

awk '/Solaris|linux|unix|vms|win|proxy|terminal|unixware/{a=$2;sub(/[0-9]*$/,"",a); if (++b[a]<=2) print}' /etc/hosts

答案 2 :(得分:2)

另一种方式

awk '
     match($0,/Solaris|linux|unix|vms|win|proxy|terminal|unixware/,a)&&++b[a[0]]<=2
' file

解释

匹配变量a中的名称和商店列表(此后不包括数字)。
然后递增另一个名为b的数组a[0]并检查是否小于2 awk的默认操作是print

VOILA

192.9.200.12 Solaris1
192.9.200.13 Solaris2
192.9.200.17 linux1
192.9.200.18 linux2

答案 3 :(得分:1)

awk '{t=$2; sub(/[0-9]+$/,"",t)} /Solaris|linux|unix|vms|win|proxy|terminal|unixware/ && ++cnt[t] <= 2' /etc/hosts | sort

<强>逻辑:

如果当前行匹配,

变量t将保存修改的最后一个字段(例如:Solaris1 =&gt; Solaris,Solaris2 =&gt; Solaris,linux1 =&gt; linux,linux3 =&gt; linux等...)模式,并且已找到少于2个匹配项,打印行...最后sort如果需要。