如何从列表中提取子域

时间:2015-03-05 14:38:49

标签: bash awk sed

我有一个类似下面示例的列表,我正在寻找一种方法来提取子域(如果适用)。

10.1.55.2 router1.local.com
192.168.1.5 server1
192.168.1.6 server2.local

如何使用awk,sed或类似工具获取上面的列表并最终获得如下所示的列表?

router1
server1
server2

我相当新手来编写脚本,所以我正在寻找一个可以开始的地方。谢谢!

4 个答案:

答案 0 :(得分:2)

我说

awk '{ sub(/\..*/, "", $2); print $2 }' hosts

这会在第二个字段的第一个句点之后切断所有内容并打印结果。

附录:由于hosts文件行中可能有多个主机名,并且要排除注释行,您可能需要使用

awk '!/^#/ { for(i = 2; i <= NF; ++i) { sub(/\..*/, "", $i); print $i } }' hosts

抓住他们所有人。

答案 1 :(得分:0)

通过sed,

$ sed 's/^[^ ]* \|\..*//g' file
router1
server1
server2

通过awk,

$ awk '{ split($2,a,/\./); print a[1] }' file
router1
server1
server2

答案 2 :(得分:0)

awk '!/#/{print $2}' hosts | awk -F"." '{print $1}'

忽略其中包含#个字符的行

答案 3 :(得分:0)

这是一个bash版本:

while read ip host; do echo ${host%%.*}; done < list

${host%%.*}表达式会删除从字符串末尾到第一个句点的所有内容。