【问题标题】:how to match only the two first hosts from host file如何仅匹配主机文件中的前两个主机
【发布时间】:2015-02-05 20:40:29
【问题描述】:

使用以下 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 一个线性命令,该命令将仅打印两个第一个匹配主机,如下所示

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

【问题讨论】:

  • sample 显示带有结束索引的 OS,它总是从 1 开始而不是 2 还是纯样本(我们可以假设过滤器基于 OS + 12 )?跨度>

标签: linux bash perl awk sed


【解决方案1】:

从命令行使用 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

【讨论】:

  • ++$s{$1} 是做什么的?
  • 我不太了解 perl,我了解++,因为它用于多种语言。我更想知道$s{$1}是什么,是之前if的结果吗?
  • @Jidder $1 是第一个从正则表达式中捕获的组,并用作%s 哈希中的键。
  • @Jidder 如果您有兴趣,请查看perlmaven.com/perl-hashes 以及其他(简短直接的)文章。
  • 再次感谢,这看起来是一个非常好的开始网站。
【解决方案2】:

通过 awk

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

【讨论】:

    【解决方案3】:

    另一种 awk 方式

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

    说明

    匹配名称列表并存储在变量a 中(这不包括后面的数字)。
    然后增加另一个数组b,名称为a[0],并检查是否小于2
    awk 的默认操作是打印

    192.9.200.12 Solaris1
    192.9.200.13 Solaris2
    192.9.200.17 linux1
    192.9.200.18 linux2
    

    【讨论】:

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

      逻辑:

      变量t 将保留修改后的最后一个字段(例如:Solaris1 => Solaris、Solaris2 => Solaris、linux1 => linux、linux3 => linux 等...)如果当前行匹配模式,并且小于已找到 2 个匹配项,打印该行...如果需要,最后是 sort

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-20
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        相关资源
        最近更新 更多