Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何从列表中提取子域_Bash_Awk_Sed - Fatal编程技术网

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