我正在文件中查找/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