2015-11-10 4 views
0

С помощью этой команды:результат Extract с помощью команды AWK

cat access.log | grep file | grep xx.xx.xx.xx | awk -F "-" '{print $3}' | awk -F "[" '{print $2}' | awk -F "]" '{print $1}' | awk -F " " '{print $1}' 

я получить этот результат:

10/Nov/2015:17:38:47 

мне нужно иметь на выходе результат, отформатированный как это:

10/Nov/2015:17 

Я пытаюсь добавить это:

awk -F ":" '{print $1,":",$2}' 

Но я получить:

10/Nov/2015 : 17 

Как я могу получить результат без этого заготовки? Спасибо :)

+0

Можете ли вы дать образец файла журнала? Должно быть, это 'awk'? Несколько цепочек 'awk' кажется неправильным. – Sobrique

+1

Похоже, вы должны научиться поддерживать регулярные выражения. 2 раза grep и 5 раз (!!) awk в * одном * трубе это слишком тяжело! – hek2mgl

ответ

3

Просто удалите запятые, так AWK не вставляет OFS (пробел по умолчанию) между каждым полем:

awk -F ":" '{print $1":"$2}' 

Хотя было бы более идиоматических установить OFS себя:

awk -F ":" -v OFS=":" '{print $1,$2}' 
+0

Большое вам спасибо! : D – Isky

0

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

Я собираюсь взять немного догадку, что вы смотрите на журнал в httpd доступа глядя, как это: (от: http://www.monitorware.com/en/logsamples/apache.php)

64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846 
64.242.88.10 - - [07/Mar/2004:16:06:51 -0800] "GET /twiki/bin/rdiff/TWiki/NewUserTemplate?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4523 
64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200 6291 
64.242.88.10 - - [07/Mar/2004:16:11:58 -0800] "GET /twiki/bin/view/TWiki/WikiSyntax HTTP/1.1" 200 7352 
64.242.88.10 - - [07/Mar/2004:16:20:55 -0800] "GET /twiki/bin/view/Main/DCCAndPostFix HTTP/1.1" 200 5253 
64.242.88.10 - - [07/Mar/2004:16:23:12 -0800] "GET /twiki/bin/oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.1" 200 11382 
64.242.88.10 - - [07/Mar/2004:16:24:16 -0800] "GET /twiki/bin/view/Main/PeterThoeny HTTP/1.1" 200 4924 
64.242.88.10 - - [07/Mar/2004:16:29:16 -0800] "GET /twiki/bin/edit/Main/Header_checks?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851 
64.242.88.10 - - [07/Mar/2004:16:30:29 -0800] "GET /twiki/bin/attach/Main/OfficeLocations HTTP/1.1" 401 12851 

Чтобы получить то, что вы хотите из него:

#!/usr/bin/env perl 
use strict; 
use warnings; 

while (<>) { 
    if (m/64.242.88.10/ 
    and m/TWiki/)  { 
     my ($date, $tz) = m/\[(\S+):\d{2}:\d{2} ([-+\d]+)\]/; 
     print $date,"\n"; 
    } 
} 

который печатает:

07/Mar/2004:16 
07/Mar/2004:16 
07/Mar/2004:16 

Это может быть один вкладыш-маньяков таким образом:

perl -lne 'if (m/64.242.88.10/ and m/TWiki/ and m/\[(\S+):\d{2}:\d{2} /) { print $1 }' access.log 

Или, как было отмечено glenn jackman:

perl -lne '/64.242.88.10/ && /TWiki/ && /\[(\S+):\d{2}:\d{2}/&& print $1' access.log 
+0

Если вы сопоставляете числовые часовые пояса, вы можете получить некоторые из них с '+ 0300', поэтому ваш матч может быть' [+ -] \ d + ' –

+0

Ваш однострочный лоток можно немного поиграть в гольф без потери удобочитаемости , Я думаю: 'perl -lne '/64.242.88.10/ &&/TWiki/&&/\ [(\ S +): \ d {2}: \ d {2}/&& print $ 1' access.log' –

0

Используя один и тот же файл журнала @ ответ Sobrique в вы можете попробовать этот простой скрипт

awk '/^64.242.88.10/ && /twiki/ {print $4}' access.log | cut -c2-15 

при условии, что вы заинтересованы в конкретный ip и ключевое слово = twiki (файл в вашем примере)

Смежные вопросы