Linux / Cut устанавливает f2 вместо f1, если f1 пуст - PullRequest
0 голосов
/ 30 марта 2020

у меня на работе следующая проблема:

у нас есть файл xml, из которого мы читаем информацию, такую ​​как имя хоста, адрес и адрес ОС, через 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 информации в каждой строке, разделенных | как

imahost|192.168.50.6|windows

некоторые серверы не имеют имени хоста, а только ip и os, как

|192.168.50.7|windows

, тогда мы вырезали имя хоста и ip из файла, где f1 - имя хоста и f2 похож на ip:

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

это выглядит так

imahost|192.168.50.6
|192.168.50.7
...

если имя хоста недоступно, как во второй строке, ip должен быть вставлен в первую позицию как

imahost|192.168.50.6
192.168.50.7|192.168.50.7
...

как нам это сделать? ^^

Заранее благодарю за каждый полезный ответ

1 Ответ

1 голос
/ 30 марта 2020

awk может обрабатывать пустые столбцы:

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

Установите разделитель поля ввода и вывода на |. Если первый столбец пуст, скопируйте содержимое второго столбца в первый столбец. В любом случае выведите первую и вторую строки.

Вывод:

imahost|192.168.50.6
192.168.50.7|192.168.50.7

См .: 8 Мощные встроенные переменные Awk - FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

...