Скрипт Sed / awk для нестандартного журнала доступа Apache (Oracle Weblogic)

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

У меня есть нестандартный протокол доступа Apache со следующим форматом:

#Version: 1.0 #Fields: c-ip date time cs-method cs-uri sc-status time-taken bytes #Software: WebLogic #Start-Date: 2014-07-21 11:21:59 10.000.000.000 2014-07-21 11:22:16 GET /em/skins/login.css 200 0.1 1091 10.000.000.000 2014-07-21 13:55:36 POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet= 200 0.766 519376 

Сценарий, который я создал, – это:

 sed -i 's/[[:space:]]\+/ /g;s/\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\/\([0-9][0-9]\)/\3-\2-\1/;s:-:/:g' log.access 

Но я ударил стену и хотел бы помочь, чтобы закончить в журнале доступа следующий формат:

 10.000.000.000 - - [21/07/2014:11:22:16 +0200] "GET /em/skins/login.css HTTP/1.1" 200 1091 10.000.000.000 - - [21/07/2014:13:55:36 +0200] "POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet= HTTP/1.1" 200 519376 

Просто FYI … У меня несколько разных IP-адресов, которые делают GET / POST.


Следующая строка awk получила мне то, что я хотел

 awk '!/^#/ && NF{split($2,a,"-"); printf "%s - - [%s/%s/%s:%s] \"%s %s\" %s %s %s\n", $1, a[3], a[2], a[1], $3" +200", $4, $5" HTTP/1.1", $6, $7, $8}' alm_server1_51100_access.log > test.test 

Все спасибо fedorqui

One Solution collect form web for “Скрипт Sed / awk для нестандартного журнала доступа Apache (Oracle Weblogic)”

Хорошая разметка:

 awk '!/^#/ && NF { split($2,a,"-") printf "%s - - [%s/%s/%s:%s] \"%s %s\" %s %s\n", $1, a[3], a[2], a[1], $3, $4, $5, $6, $7 }' file 

Если ваш ввод – это только строки, начинающиеся с 10.000 … это делает это:

 $ awk '{printf "%s - - [%s:%s] \"%s %s\" %s %s\n", $1, $2, $3, $4, $5, $6, $7}' file 10.000.000.000 - - [2014-07-21:11:22:16] "GET /em/skins/login.css" 200 0.1 10.000.000.000 - - [2014-07-21:13:55:36] "POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet=" 200 0.766 

Если вы также хотите пропустить пустые строки и те, которые начинаются с # , то это делает это:

 awk '!/^#/ && NF{printf "%s - - [%s:%s] \"%s %s\" %s %s\n", $1, $2, $3, $4, $5, $6, $7}' file 

Оба подхода используют один и тот же формат printf , который проходит через поля, добавляющие кавычки, скобки, тире, которые вы хотите.

Чтобы форматировать данные по-разному, используйте split() и перемещайте элементы последующего массива a[] :

 $ awk '!/^#/ && NF{split($2,a,"-"); printf "%s - - [%s/%s/%s:%s] \"%s %s\" %s %s\n", $1, a[3], a[2], a[1], $3, $4, $5, $6, $7}' file 10.000.000.000 - - [21/07/2014:11:22:16] "GET /em/skins/login.css" 200 0.1 10.000.000.000 - - [21/07/2014:13:55:36] "POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet=" 200 0.766 
  • Добавьте пробел или вкладку перед последним символом в каждой строке
  • Почему это добавляет пробелы? echo "x ax" | sed 's / x \ s * / x /'
  • Скопируйте до определенного многострочного шаблона
  • SED Поиск и замена на Linux
  • выбор строки из записи в файле
  • Удалить первую строку файла
  • Добавление символа в любую другую текстовую строку
  • как вычесть первое значение из последнего в столбце по строке в оболочке?
  • Полосы пробелов после одиночных заглавных букв с sed
  • вырезать последние два с sed?
  • Обрезать текст без цикла
  • Linux и Unix - лучшая ОС в мире.