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

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

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

Может ли awk работать с несколькими строками, или я должен смотреть на то, чтобы перенести первый элемент в переменную памяти и вывести его, когда пройдет второе поле?

2017-08-11 17:12:53.763 TRACE 25528 --- [http-nio-10040-exec-16] cbgsSpnegoAuthenticationFilter : Principal [pqr-xyz-coredev@ABC1.COM] user ID =='pqr-xyz-coredev' 2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] cbgsSpnegoAuthenticationFilter : No GoP header [Gop-User] for pqr-xyz-coredev@ABC1.COM 2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] cbgsSpnegoAuthenticationFilter : User [pqr-xyz-coredev] details obtained. { "username": "pqr-xyz-coredev", "password": "[PROTECTED]", "country": null, "department": null, "title": null, "email": null, "enabled": true, "accountNonExpired": true, "credentialsNonExpired": true, "accountNonLocked": true, "grantedAuthorities": [ "GBSUD101 SUPPORT", "RG OAG WE1-T1-01234 ADM" ] } 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 URI: /data/load/REF.SWE.RUN.ALL.M.KBD/2017-08-11 GET 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 HEADER 'host': rsadffs199.abc1.com:10040 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 HEADER 'user-agent': PycURL/7.43.0 libcurl/7.52.1 WinSSL zlib/1.2.8 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 HEADER 'accept': */* 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 AUTHORIZATION: hash not displayed 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 PARAM 'endDate': 2099-12-31 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 PARAM 'startDate': 1900-01-01 2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] cbgusRequestResponseLoggingFilter : 936 REMOTE ADDRESS: 101.16.75.75 

  • Поиск данных из всех файлов в папке
  • gawk присоединяется к двум TSV по столбцам (a'la sql join)
  • Как эффективно разделить большой текстовый файл без разделения многострочных записей?
  • как создать файл данных со столбцом даты от дня1 до дня?
  • Как печатать из заданного диапазона ip-адресов каждый класс-c с последним октетом, замененным звездочкой
  • проверить переменную в файле для согласованности в приращении
  • Арифметика по переменной, содержащей ip-адрес
  • Сжатие нескольких строк из вывода Nmap
  • 2 Solutions collect form web for “Как я могу захватить два поля в awk из разных строк записи с несколькими строками?”

    Попробуйте ниже awk :

     awk -F"[=':]" '/user ID/{userID=$(NF-1)} /REMOTE ADDRESS/{print userID"," $NF}' `infile.txt 

    Выход:

     pqr-xyz-coredev, 101.16.75.75 
     perl -F"\h+|'" -lane ' /\huser\h+ID\h/ and $a = $F[-1]; /\hREMOTE\h+ADDRESS:\h/ and print "$a $F[-1]"; ' log.file 
    • Perl :
      • -F"\h+|'" Это разделяет текущую строку либо на пробег горизонтальных пробелов, либо на символ одной кавычки. Это гарантирует, что информация, которую мы ищем, всегда находится в последнем поле.
      • -l Это устанавливает ORS в новую строку, а также IRS в новую строку.
      • -a Это разделит входные записи на основе разделителя полей, предоставленного опцией -F или по умолчанию используется пустое пространство. Поля, вырезанные из текущей записи, сохраняются в массиве @F .
      • -n Это установит неявный входной цикл чтения файла + автоматическая запись записей в stdout будет отключена.
    • когда мы сталкиваемся с линией с user ID и ограничены с обеих сторон горизонтальным пробелом, мы продолжаем и помним идентификатор пользователя, сохраненный в последнем поле, а именно: $F[-1] .
    • когда мы сталкиваемся с линией с REMOTE ADDRESS: и ограничены с обеих сторон горизонтом. пробел, мы продолжим и печатаем идентификатор пользователя, хранящийся ранее, и последнее поле этой строки, которое должно содержать IP-адрес.

    Результаты:

     pqr-xyz-coredev 101.16.75.75 
    Interesting Posts

    Как автоматически определять и записывать в usb с переменными пространствами в его имени

    Как установить zabbix-agent поверх apt-get

    Разрешение местоположения / регистрации исполняемого файла в системе?

    «Echo> / sys / …» не вступает в силу при использовании> / dev / null 2> & 1

    пытается настроить apache для ssl

    получение 553 – невозможно создать файл в vsftpd (ubuntu 12.04)

    Значение пересечения границ файловой системы, – однофайловая система и т. Д.

    Может ли hd и od заменить друг друга?

    Сценарий создания псевдонима multipath.conf

    Извлечение текста с веб-сайта исходного кода

    Не удается запустить JD-GUI с 64-разрядными разделяемыми библиотеками, нужны 32-разрядные библиотеки

    Определение того, какой DNS-сервер используется

    Что произойдет, если я установил уровень запуска системы по умолчанию на 0 или 6?

    Копирование «live usb» с USB-накопителя на портативный жесткий диск

    Как я могу получить звук, работающий на моем Powerbook G4 15 «под управлением Debian 8.6?

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