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

Учитывая файл данных, который содержит различный контент, я хотел бы сначала проигнорировать любую строку, которая не начинается с 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 

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

  • Очень простой вопрос H / W с использованием трубы и grep
  • строковые манипуляции без awk или sed
  • Извлечь два значения из вывода команды
  • Сбросьте шаблон слова в конце строки, используя sed
  • Использование регулярных выражений для поиска списка слов. Поиск двух букв вместо 3. Почему?
  • Как найти строку после регулярного выражения в одной строке текста?
  • условная окраска в grep
  • распечатать определенную строку из нескольких файлов
  • Поведение POSIX привязок sed и $ regex с многострочными пространствами шаблонов
  • Как проверить, имеет ли файл уже строку с содержимым?
  • Как я могу группировать числа в файле
  • Linux и Unix - лучшая ОС в мире.