Как анализировать файл данных для извлечения определенных данных и формата для другого использования?

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

Например:

ВХОД:

 junk12 junk34 198.0.12.20 [ joker penguin character=villian ] blah 198.0.13.20 [ super_man bat_man character=hero ] blah 198.0.14.20 [ lois_lane character=damsel ] blah junk56 junk78 

ВЫВОД:

 198.0.12.20 joker 198.0.12.20 penguin 198.0.13.20 super_man 198.0.13.20 bat_man 198.0.14.20 lois_lane 

One Solution collect form web for “Как анализировать файл данных для извлечения определенных данных и формата для другого использования?”

Могут быть много способов сделать это, но в awk мы можем сделать что-то вроде

 awk 'gsub(/^[0-9.]+ \[ /,$1 " ") { a=2; while (a<=NR && $a != "]") { if ($a !~ /=/) {print $1 " " $a } ; a++ } }' 

Давайте разложим это на нечто более читаемое:

 gsub(/^[0-9.]+ \[ /,$1 " ") { .... } 

Это будет соответствовать линиям, начинающимся с цифр и точек, а затем пробелом и [ . Таким образом, он будет соответствовать 10.20.30.40 [ но не будет соответствовать junk23 . Он заменит его первым полем, а затем запустит материал внутри {...} .

Таким образом,

 198.0.12.20 [ joker penguin character=villian ] blah 

войдет в этот раздел, похожий на

 198.0.12.20 joker penguin character=villian ] blah 

Теперь средняя часть, которая может быть легче понять, если мы напишем ее по нескольким строкам:

 a=2; while (a<=NR && $a != "]") { if ($a !~ /=/) {print $1 " " $a } a++; } 

Итак, мы начинаем со второго поля («джокер» в этом случае) и продолжаем, пока не закончим слова или не увидим ] . Для каждого найденного слова, если оно не содержит an = мы печатаем первое поле (IP-адрес) и слово.

Результаты:

 198.0.12.20 joker 198.0.12.20 penguin 198.0.13.20 super_man 198.0.13.20 bat_man 198.0.14.20 lois_lane 

(Вероятно, есть лучшие способы сделать это!)

  • Копировать файл при замене текста в нем
  • Замените в верхнем регистре на нижний регистр, кроме первой буквы каждого слова в определенной строке
  • Использование CSV-строки в качестве параметров команды
  • «Sed» переписать файл для отображения целых чисел и удалить оставшиеся символы
  • Мне нужно удалить. в моих данных
  • Как извлечь первое целое из текстовой строки в столбце файла с разделителями табуляции?
  • Редактируйте несколько строк из определенного раздела INI-файла
  • Как вложить глобальные совпадения с sed?
  • Как объединить все файлы в заданном каталоге по дате, где я хочу, чтобы самый новый файл был сверху?
  • Полосы пробелов после одиночных заглавных букв с sed
  • Лучше, чем `tee | разрезать | ... | paste`
  • Interesting Posts

    zfs-fuse: включение сжатия не влияет

    Intel cpu не отображается как совместимый с VGA контроллер

    Имеет ли Yum эквивалент DEBIAN_FRONTEND = aptitude = неинтерактивный?

    Поменять местами и группами по квадратным скобкам

    Сортировка на основе поля1, field2, но сохранение поля 1 сортировки и игнорирование нулей / пробелов во 2-й сортировке

    Bash перезаписывает первую строку при использовании пользовательской подсказки PS1

    Как использовать ключ безопасности для входа в NordVPN?

    Почему я получаю «rsync: не удалось установить время на …: операция не разрешена (1)» ошибка на Ubuntu 10.10 с SME Server 7.4?

    Удаление прокомментированных строк в текстовом файле с помощью sed

    FATAL: модуль hello.ko не найден

    объединение нескольких файлов с несколькими заголовками

    Запись массива по умолчанию в переменную Bash

    Как проверить поврежденные и дублированные шрифты на Linux?

    нужна портативная crontab-проверка хоста / отказоустойчивая логика в Linux и Cygwin

    команда watch для удаления файлов в каталоге каждые N сек.

    Linux и Unix - лучшая ОС в мире.