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

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 октетов и сортировки
  • Объедините два результата вместе
  • Как перечислять файлы с именем XXXmmyy.dat в естественном хронологическом порядке?
  • извлечение доменных имен (имен хостов) из текстового файла
  • Сценарий для отображения количества файлов (по типу файлов) в каталоге?
  • Сортировка STDIN по длине и количеству небилетов в скрипте Bash
  • Считайте уникальные строки только для заданного шаблона
  • Добавить слова в список слов с помощью sort -u avoinding duplicata
  • Каков порядок сортировки при использовании условных операторов?
  • Как сделать обратный вывод, который уже передан из команд сортировки и вырезания
  • Получить последнюю минуту из строк из списка
  • как получить последний файл в каждом каталоге
  • бездисковый поиск дубликатов имен файлов
  • Linux и Unix - лучшая ОС в мире.