查找带有通配符的文本

查找带有通配符的文本

我正在文件中查找/etc/hosts应包含至少如下所示服务器的主机:

mobile.example.com
more.mobile.example.com

而不是 example.com

我想用这样的通配符进行搜索:

sed// awk// find/grep其中word.word.word < path/to/inputfile > path/to/outputfile单词由以下组成[A-Z, a-z, 0-9]

请为此编写“sed”、“awk”、“find”或“grep”代码。

答案1

/etc/hosts每个 IP 地址条目可以有一个或多个主机名,因此我们需要检查每个主机名(即除第一个字段之外的所有字段)以查看其中是否包含 2 个或更多.字符。

例如:

awk '{for (f=2;f<=NF;f++) {if (split($f,array,/\./)>2) {print;last}}}' /etc/hosts

或者,添加换行和缩进以提高可读性:

awk '
  {
    for (f=2;f<=NF;f++) {
      if (split($f,array,/\./) > 2) {
        print;
        last;
      }
    }
  }' /etc/hosts

这将打印/etc/hosts任何主机名至少有 2 个文字.字符的每一行。

它迭代输入行中的每个字段,并使用 awk 的函数来执行此操作,按字符split()分割。.由分隔符分割成元素的字符串将始终比分隔符的数量多 1 个元素,因此测试必须是> 2而不是>= 2。例如,“example”本身就有一个元素。 “example.com”将有两个元素(“example”和“com”)。 “mobile.example.com”将有 3 个。

split()还将字符串拆分为数组,但对于此任务,我们只对返回值(元素数量)感兴趣并忽略数组。

一旦脚本找到主机名包含两个或多个.字符,它会打印整行,跳出 for 循环(使用last),然后移至下一个输入行。

答案2

实际上,阅读您的评论,它不是一个真正的主机文件,而只是一个域名列表,因此您似乎满意地用至少两个点过滤所有行:

grep '\..*\.' hostfile

如果域位于行的开头很重要,请使用

grep '^[[:alnum:]]*\..*\.' hostfile

相关内容