Intereting Posts
Сколько фактических разработчиков работает в ядре Linux Почему Bash не удалось найти команду, даже если $ PATH указан правильно? ctrl + c при входе в систему Выход Strace не отображает системный вызов Как создать интерактивный скрипт bash для сбора аргументов для команды в Linux? Не удается найти с помощью поиска yum, но вы можете увидеть его в списке yum Маршрутизация входящих сетевых запросов для данного порта в разные приложения Как спасти Ubuntu Server 16.04, который отключается сценарием systemd? Как настроить раздел «данных», разделяемый несколькими ОС Linux? Как остановить emacs от окраски текста файла, который я редактирую? Пароль защищает PDF-файл с помощью AES 256 Могу ли я фильтровать, как часто cron отправляет мне электронное письмо? Как извлечь N-й файл с помощью 7-zip Как переименовать файлы и преобразовать datestamp из DD-MM-YYYY в YYYY-MM-DD? Wifi Direct между linux & android

Выбор и сортировка IP-адреса, поддерживающего всю строку

Поэтому мне нужно отсортировать IP-адреса, а затем отсортировать их строки.

Я могу сортировать IP-адреса в файле, используя: sort -n -t . -k1,1 -k2,2 -k 3,3 -k4,4 sort -n -t . -k1,1 -k2,2 -k 3,3 -k4,4

Если мой файл выглядит так:

  add method1 abcd other thing add method2 efgh other thing2 add method2 abcd other thing2 add method5 jklm other thing5 add method3 abcd other thing3 add method1 efgh other thing2 

Но в этом случае поле 1 будет:

  add method1 a add method2 e add method2 a add method5 j add method3 a add method1 e 

И поле 4 будет:

  d other thing h other thing2 d other thing2 m other thing5 d other thing3 h other thing2 

Как и какие инструменты следует использовать для сортировки моих IP-адресов, а затем сортировки их строк. Заранее спасибо.

EDIT: пример modfied. Существует несколько строк с одним и тем же IP-адресом, но с разным текстом и в произвольном порядке.

Этот скрипт копирует ip-адрес из поля 3 с помощью awk в начало строки с разделителем «%», затем выполняет сортировку по ip-адресу в первом поле, а затем удаляет добавленную часть.

 awk '{print $3 " % " $0}' | sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 | sed 's/[^%]*% //' 

Если поле с IP-адресом не является константой, вы можете автоматически определить его на каждой строке. Замените awk выше:

 awk '{ for(i=1;i<=NF;i++) if($i~/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/)break; print $i " % " $0 }' | 

Поздний ответ, но это может помочь кому-то. Если у вас есть новая версия GNU sort (от GNU coreutils 7.0 или новее), вы можете использовать опцию --version-sort (или -V ), которая будет делать правильные действия с IPv4-адресами. Предполагая ввод:

 add method1 10.1.2.3 other thing add method2 10.10.20.30 other thing2 add method2 10.1.2.3 other thing2 add method5 10.2.8.9 other thing5 add method3 10.1.2.3 other thing3 add method1 10.10.20.30 other thing2 

Запуск этого через sort -k 3 -V даст:

 add method1 10.1.2.3 other thing add method2 10.1.2.3 other thing2 add method3 10.1.2.3 other thing3 add method5 10.2.8.9 other thing5 add method1 10.10.20.30 other thing2 add method2 10.10.20.30 other thing2 

Ожидается, что вы знаете параметр -t ( man sort : field separator). Команда, которую вы хотели использовать, касается только простых IP-адресов.

Быстрое и грязное решение может заключаться в преобразовании пространств в точки . сначала файл, а затем сортировку (возможно, вы захотите отменить преобразование позже, исключая IP-адреса)

 sed -i.bak 's/ /./g' data.log sort -n -t . -k2,2 -k3,3 -k4,4 -k5,5 data.log 

Обратите внимание, что я переместил индексы. Попробуйте.