Сортировка 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 один вкладыш … и т. Д.

  • Сортировка точек монтирования по времени монтирования
  • Самый простой способ подсчета строк, соответствующих определенным шаблонам, включая «0», если строка не найдена?
  • Самый быстрый инструмент `uniq` в linux
  • Sed / awk / perl: порядок реверсирования значений, разделенных запятыми, сохранение другого текста
  • Управление дублированными строками в файлах
  • Есть ли LC_COLLATE, который сортирует точку перед тире?
  • Как сортировать по двум полям чисел
  • Порядок сортировки для заказа этого списка в определенном порядке
  • 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 - лучшая ОС в мире.