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

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

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

  • Инструмент для создания текстовых файлов из шаблона
  • Печатать текст между (и включая) двумя разделителями по строке
  • Тысяча разделителей в awk
  • Каков самый простой способ добавить строку в начале каждой строки файла из командной строки?
  • Bash: преобразовать многострочный вывод в одну строку
  • Что такое * .sorted команда и почему она не работает в моем bash?
  • Может ли 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 

  • сравните файл B с A и извлеките данные из A с помощью awk, sed или grep
  • Почему $ var дает значение $ 0?
  • извлеките 4-й столбец из файла csv с помощью команды unix
  • Как хорошо выровнять таблицу отображения
  • Объединение нескольких файлов с общим заголовком
  • Bash Script для отображения разницы между двумя текстовыми файлами
  • 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 
    Linux и Unix - лучшая ОС в мире.