使用以下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
答案 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
如果需要。