创建脚本以在:字符之前打印出文本,每个输出在单独的行中

时间:2019-03-26 13:06:22

标签: bash

我有一个包含主机名和ips的文件,我想在单独的一行中打印出每个主机名和ip。我正在使用bash在Linux主机上工作,我有一个:作为定界符,但在某些输出中:之前和之后可以有空格。

我的文件如下:

hostname.abc.com:10.10.1.1:hostname2.abc.com:10.12.40.1 hostname5.abc.com:hostname3.abc.com:hostname4.abc.com:10.12.40.1 hostname6.abc.com:10.10 .5.8:hostname7.abc.com:10.12.41.1 hostname9.abc.com:10.10.1.6:hostname8.abc.com:10.12.2.1

大约有50行,但是有些行最多包含300个主机名/ ips。

我希望输出是一个顺序文件,其中每行只有一个主机名或ip。

我正在尝试类似的方法: awk'f {print; f = 0} /:/ {f = 1}'/ home / aaro / parsedata / nfs6 | xargs -n1

但是需要弄清楚如何在一行中遍历主机名的每个实例并遍历打印。

我的主机名并非始终以h开头。 同一行上最多可以有200个主机名和/或ip,我需要将每个主机名和/或ip分开,一次打印出一个主机名或ip。

我有一个定界符:但是我不知道如何使用print命令来打印$ 1到$ 200,每个输出在单独的一行上。

主机名和ips与我的共享文件不同,因为共享主机名和ips不是一个好主意。

我无法输入所需的输出。我需要在每一行的每一行都包含一个主机名或一个ip,但是即使我为每个主机名和ip都放置了单独的行,这里的编辑器还是将输出打包为一行。

每行在单独的行中带有:分隔符的列,每行具有不同的列数,有些包含1、6、5、187和200列。

2 个答案:

答案 0 :(得分:0)

首先删除一些空格,以便使用更简单的grep命令

sed 's/[ ]*:[ ]*/:/g' file | grep -Eo "[a-zA-Z][^:]*:[0-9.]*"

sed 's/[ ]*:[ ]*/:/g' file | grep -Eo "[^:]+:[0-9.]*"

编辑:首先,我使用h查找主机名的第一个字母。

答案 1 :(得分:0)

如果您希望输出是一个顺序文件,其中每行只有一个主机名或ip,那么此sed就足够了:

sed 'y/:/\n/' infile