2012-05-23 1 views
1

У меня есть файл журнала, который содержит, помимо других данных, такие строки:Разбор строки текстового файла

2012-05-23T20:52:11+00:00 heroku[router]: GET myapp.com/practitioner_activities/10471/edit dyno=web.2 queue=0 wait=0ms service=866ms status=200 bytes=48799 
2012-05-23T20:52:46+00:00 heroku[router]: GET myapp.com/users/sign_out dyno=web.1 queue=0 wait=0ms service=20ms status=302 bytes=88 
2012-05-23T20:52:46+00:00 heroku[router]: GET myapp.com/ dyno=web.13 queue=0 wait=0ms service=18ms status=200 bytes=4680 
2012-05-23T20:53:04+00:00 heroku[router]: POST myapp.com/p/ENaCXExu7qNEqzwYYyPs dyno=web.5 queue=0 wait=0ms service=207ms status=302 bytes=119 
2012-05-23T20:53:04+00:00 heroku[router]: GET myapp.com/practitioner_activities/welcome dyno=web.3 queue=0 wait=0ms service=57ms status=200 bytes=5061 
2012-05-23T20:53:04+00:00 heroku[router]: GET myapp.com/assets/application-print-715276cc0b76d0d82db3ab5866f22a23.css dyno=web.14 queue=0 wait=0ms service=9ms status=200 bytes=76386 

Я хотел бы, чтобы разобрать их и складывать их в файл можно открыть с помощью Excel для анализа , Мне нужны Час, Минута, Глагол (GET или POST), url и время обслуживания.

Например, для первой строки выше:

2012-05-23T20:52:11+00:00 heroku[router]: GET myapp.com/practitioner_activities/10471/edit dyno=web.2 queue=0 wait=0ms service=866ms status=200 bytes=48799 

Я бы ожидать выход смотреть что-то вроде:

"20", "52", "GET", "myapp.com/practitioner_activities/10471/edit", "866" 

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

ответ

3

Использование awk, вы могли бы попробовать что-то вроде:

awk '{ OFS="\", \""; split ($8, array, "="); printf "\"" substr ($1 , length ($1) - 13, 2) OFS substr ($1 , length ($1) - 10, 2) OFS $3 OFS $4 OFS substr (array[2], 0, length (array[2]) -2) "\"\n" }' file.txt 

Результаты:

"20", "52", "GET", "myapp.com/practitioner_activities/10471/edit", "866" 
"20", "52", "GET", "myapp.com/users/sign_out", "20" 
"20", "52", "GET", "myapp.com/", "18" 
"20", "53", "POST", "myapp.com/p/ENaCXExu7qNEqzwYYyPs", "207" 
"20", "53", "GET", "myapp.com/practitioner_activities/welcome", "57" 
"20", "53", "GET", "myapp.com/assets/application-print-715276cc0b76d0d82db3ab5866f22a23.css", "9" 

HTH

Edit:

awk '{ OFS="\", \""; ORS="\"\n"; split ($8, array, "="); print "\"" substr ($1 , 12, 2), substr ($1 , 15, 2), $3, $4, array[2] + 0 }' file.txt 

Спасибо Деннис! Код намного более приятно :-) Теперь

+0

помогает, спасибо. –

+0

Я мог бы помочь :-) – Steve

+0

Вы можете использовать 'ORS =" \ "\ n" и 'print' с запятыми (вместо того, чтобы явно указывать' OFS' несколько раз, однако вы все равно должны установить 'OFS', как вы) вместо 'printf' (так как вы не используете строку формата). Или вы можете« printf »\«% d »OFS«% d »OFS«% s »OFS«% s »OFS«% d \ » \ n ", substr ($ 1, length ($ 1) - 13, 2), substr ($ 1, length ($ 1) - 10, 2), $ 3, $ 4, substr (array [2], 0, length (array [2 ]) - 2) ', который разделяет представление и данные. Кроме того, в этом последнем случае вы могли бы использовать более короткое имя переменной, чем' OFS'. Использование 'length' на самом деле не требуется. Временная метка фиксированной длины (вы полагаясь на ... –

1

рубин ответить

ruby -ane ' 
    hr, min = $F[0][/(?<=T)\d\d:\d\d/].split(/:/) 
    svc = $F[7].split(/=/)[-1]; svc[/ms/] = "" 
    puts %q{"%d", "%d", "%s", "%s", "%d"} % [hr, min, $F[2], $F[3], svc] 
' logfile