Linux/Cut 如果 f1 为空,则设置 f2 代替 f1

Linux/Cut set f2 in place of f1 if f1 is empty

我在工作中遇到以下问题:

我们有一个 xml 文件,我们从中读取 infos ,如 hostname,地址和 os 通过 xmlstarlet 并重定向它们到一个单独的文件中。

这是脚本:

xmlstarlet sel -t -m "//host" -m "hostnames/hostname" -v "@name" -b -o "|" -v "address[@addrtype='ipv4']/@addr" -o "|" -v "os/osmatch[1]/@name" -n nmap.xml > newfile

现在我们有 3 个 infos 每行由 | 分隔喜欢

imahost|192.168.50.6|windows

有些服务器没有 hostname,只有 ip 和 os like

|192.168.50.7|windows

然后我们从文件中删除 hostname 和 ip,其中 f1 是 hostname,f2 是 ip,如:

cat newfile | cut -d"|" -f1,2

看起来像这样

imahost|192.168.50.6
|192.168.50.7
...

如果 hostname 在第二行中不可用,则应将 ip 插入到第一个 pos 中,如

imahost|192.168.50.6
192.168.50.7|192.168.50.7
...

我们如何做到这一点? ^^

我提前感谢您的每一个有用的回答

awk 可以处理空列:

awk 'BEGIN{FS=OFS="|"} ==""{=} {print ,}' file

将输入和输出字段分隔符设置为|。如果第一列为空,则将第二列的内容复制到第一列。无论如何打印第一行和第二行。

输出:

imahost|192.168.50.6
192.168.50.7|192.168.50.7

参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR