如何使用 sed/grep/awk 从不同字段中具有 TLD 的主机名列表中打印 TLD?

如何使用 sed/grep/awk 从不同字段中具有 TLD 的主机名列表中打印 TLD?

我有一个非常大的主机名列表,我试图从中打印每个主机的 TLD(.com、.net、.info 等)。问题是主机的 TLD 位于不同的字段中,因此我无法告诉 cut 或 awk 静态打印一个字段。

一些主机名示例:

examplehost.net                             # tld is 2nd field (period delimited)
subdomain.otherhost.com                      # tld is 3rd field
subdomain.othersubdomain.yetanotherhost.info   # tld is 4th field

作为一个小解决方法,我只是在每个主机的末尾添加了一个空格,这样我就可以将其包含在我的正则表达式模式中并对其进行 grep 。

sed 's/$/ /g' listofhosts.txt | grep -Eo '\.[a-z]{1,10} '

我很好奇是否有更优雅的方法来完成此任务。

答案1

如果您的 listofhosts.txt 文件确实不是在其末尾有注释,那么 Steeldriver 的注释命令就是我将如何做到的。告诉 awk 按句点分割字段,然后打印最后一个字段的值:

awk -F. '{print $NF}' listofhosts.txt

导致:

net
com
info

答案2

与单grep(如果聚合酶链式反应支持的):

grep -Po '.*\.\K[^.]+$' listofhosts.txt 

答案3

grep -oE '\.[^.]+$'

perl -lne 'print /(\.[^.\s]+)\s/'

sed 's/^[[:space:]]*[^[:space:]]\{1,\}\([.][^.[:space:]]\{1,\}\)[[:space:]]\{1,\}.*/\1/'

相关内容