Сортировка IP-адреса в соответствии со вторым полем в файле

в моем сценарии ksh мне нужно добавить следующую задачу (ОС – linux / solaris)

У меня есть следующий файл

more test.txt /etc/backup/app 172.1.120 172.110.120 /etc/backup/app 172.1.120.12 172.110.120.98 /etc/backup/app 192.1.120 192.120.120 /etc/backup/app 172.1.120.1 172.110.120.7 /var/log/df 193.23.2 193.23.2 /var/log/df 193.23.2.111 193.23.2.159 

как найти все IP- адреса с 4 октетами в начале файла, а затем остальные IP- адреса с 3 октетами

Примечание. Сортировка IP-адресов будет соответствовать второму полю

Пример запрошенного файла (после сортировки)

  more test.txt /etc/backup/app 172.1.120.12 172.110.120.98 /etc/backup/app 172.1.120.1 172.110.120.7 /var/log/df 193.23.2.111 193.23.2.159 /etc/backup/app 172.1.120 172.110.120 /etc/backup/app 192.1.120 192.120.120 /var/log/df 193.23.2 193.23.2 

Решение может быть выполнено с помощью сортировки или ksh / awk / sed / perl один вкладыш … и т. Д.

  • сортировать данные ls пользователями
  • Перемещение строки с выхода на фронт вывода или пользовательское переупорядочение
  • Использование grep / sort / find для извлечения уникальных значений
  • вывод искажается при параллельном запуске «xargs ls»
  • Элемент сортировки POSIX Awk
  • Как я могу сортировать список с уровнем major.minor.patch и иногда rc правильно?
  • Насколько разумны утилиты unix?
  • Получить последнюю минуту из строк из списка
  • 3 Solutions collect form web for “Сортировка IP-адреса в соответствии со вторым полем в файле”

    Если у вас есть GNU awk вам нужен один лайнер:

     $ awk '{n=split($2,ip,".");if(n==4)print $0;else a[$2]=$0}END{n=asorti(a,b);for(i=1;i<=n;i++)print a[b[i]]}' file /etc/backup/app 172.1.120.12 172.110.120.98 /etc/backup/app 172.1.120.1 172.110.120.7 /var/log/df 193.23.2.111 193.23.2.159 /etc/backup/app 172.1.120 172.110.120 /etc/backup/app 192.1.120 192.120.120 /var/log/df 193.23.2 193.23.2 
     awk '{printf "%s.,%s\n", $2, $0}' | \ sed -E -e 's/^(([0-9]+\.){4}),/0.\1,/' -e 's/^(([0-9]+\.){3}),/1.\1,/' | \ sort -t. -k 1,1 -k 3,3 | \ sed -E -e 's/^[^,]+,//'` 

    Идея заключается в следующем:

    1. Скопируйте соответствующее поле в начало каждой строки и добавьте специальный разделитель (запятая в этом случае)
    2. Используйте sed для добавления некоторого значения, которое зависит от количества октетов в IP-адресе (я использовал 0 для 4 октетов и 1 для 3 октетов)
    3. Сортировка значений в соответствующих полях
    4. Разделите все, что мы добавили
     cat <(awk '{if($2~/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/){print $0}}' test.txt | sort -k 2) <(awk '{if($2~/^[0-9]*\.[0-9]*\.[0-9]*$/){print $0}}' test.txt | sort -k 2) 
    • Строки соответствия, где второе поле имеет 4 октета и сортирует
    • Строки соответствия, где второе поле заканчивается после 3 октетов и сортировки
    • Объедините два результата вместе
    Linux и Unix - лучшая ОС в мире.