Bash 如何从列表中提取子域
我有一个类似以下示例的列表,正在寻找一种方法来提取子域(如果适用)Bash 如何从列表中提取子域,bash,awk,sed,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 我是bash脚本编写的新手,所以我正在寻找一个起点。谢谢 我得说 awk '{ sub(/\..*/, "", $2); print $2 }' hosts 这
10.1.55.2 router1.local.com
192.168.1.5 server1
192.168.1.6 server2.local
我如何使用awk、sed或类似工具获取上面的列表,并最终得到如下列表
router1
server1
server2
我是bash脚本编写的新手,所以我正在寻找一个起点。谢谢 我得说
awk '{ sub(/\..*/, "", $2); print $2 }' hosts
这将从第二个字段中删除第一个周期后的所有内容,并打印结果
附录:由于hosts
文件行中可能有多个主机名,并且要排除注释行,您可能需要使用
awk '!/^#/ { for(i = 2; i <= NF; ++i) { sub(/\..*/, "", $i); print $i } }' hosts
awk'!/^#/{对于(i=2;i通过sed
$ sed 's/^[^ ]* \|\..*//g' file
router1
server1
server2
通过awk
$ awk '{ split($2,a,/\./); print a[1] }' file
router1
server1
server2
它忽略了带有#字符的行下面是一个bash版本:
while read ip host; do echo ${host%%.*}; done < list
读取ip主机时;执行echo${host%%.*};完成
${host%%.*}
expression从字符串的结尾到第一个句点都将被删除。在一般情况下,您需要一个了解本地域层次结构的工具。对于公共internet域层次结构,请参阅“太好了!”谢谢。这两个命令都解决了我试图完成的任务。请注意,这可以压缩为一个或两个命令,而不是四个:cat-file | grep
可以是grep-file
。另外,grep-v“#”| awk
可以是awk'!/#/
…是的,你是对的。我可以把它简化成这样:awk'!/{print$2}hosts | awk-F.“{print$1}
所以继续编辑它,得到更好的答案:)您可能可以调整awk,使其无需任何管道
while read ip host; do echo ${host%%.*}; done < list