awk, когда строка может быть в разных столбцах

Я пытаюсь awk информацию из именованного файла на основе первых трех октетов IP. В этом файле IP может быть как в столбце 2, так и в столбце 4. Если IP-адрес находится в столбце 2, я бы хотел напечатать то, что находится в столбце 2, то что это столбец 1. Если IP-адрес в столбце 4, я бы например, для печати столбца 4 и столбца 1. (Столбец 1 в имени сервера).

Это пример вывода со всеми напечатанными столбцами:

awk /10.1.49/ /var/named/internal/Domain/abc.com 

Результат выглядит следующим образом:

 server01 IN A 10.1.49.29 server02 IN A 10.1.49.80 ;globalname01.abc.com 10.1.49.60 ;globalname02.abc.com 10.1.49.61 

Я хочу сортировать по столбцу IP, а затем печатать IP и имя сервера:

 10.1.49.20 server01 10.1.49.60 globalname01.abc.com 10.1.49.61 globalname02.abc.com 10.1.49.80 server02 

Я знаю, как использовать {print NF} чтобы получить количество столбцов, я просто не знаю, как использовать эту информацию, например, если NF возвращает 4, тогда {print $4 $1} но если NF вернет 2, то {print $2 $1} … и желательно отсортировано поверх этого (но я могу передать эти данные в файл, а затем снова прочитать его, чтобы отсортировать его, если мне нужно).

Пытаться:

 $ awk '$NF~/^10\.1\.49/ {sub(/;/, "", $1); print $NF,$1}' file | sort 10.1.49.29 server01 10.1.49.60 globalname01.abc.com 10.1.49.61 globalname02.abc.com 10.1.49.80 server02 

Как это работает

  • $NF~/^10\.1\.49/ {..}

    Это выбирает строки, для которых последний столбец начинается с 10.1.49 . Для этих строк выполняется команда в фигурных скобках.

  • sub(/;/, "", $1)

    Первая из команд в фигурных скобках является заменой команды. Он удаляет ; из первого поля, если оно присутствует.

  • print $NF,$1

    Это печатает последнее поле, за которым следует (возможно, измененное) первое поле.

  • sort

    Это сортирует результат. Обратите внимание, что существуют возможные способы сортировки IP-адресов, и многие параметры сортировки могут помочь вам получить желаемый результат.

 awk '{ if ($1 ~ /;.*/) { print $2, substr($1, 2); } else { print $4, $1; } }' file | sort 

Вывод:

 10.1.49.29 server01 10.1.49.60 globalname01.abc.com 10.1.49.61 globalname02.abc.com 10.1.49.80 server02