2014-12-16 8 views
0

У меня есть следующий образец dmesg:dmesg преобразование метки времени в человеческий формат

throttled log output. 
57458] bar 3: test 2 on bar 8 is available 
[ 19.696163] bar 1403: test on bar 1405 is available 
[ 19.696167] foo: [ 19.696168] bar 3: test 5 on bar 1405 is available 
[ 19.696178] foo: [ 19.696179] bar 1403: test 5 on bar 1405 is available 
[ 20.928730] foo: [ 20.928733] bar 1403: test on bar 1408 is available 
[ 20.928742] foo: [ 20.928745] bar 3: test on bar 1408 is available 
[ 24.878861] foo: [ 25.878861] foo: [ 25.878863] bar 1403: bar 802 is present 

Я хотел бы преобразовать всех временные метки в линии человеческого формата ("%d/%m/%Y %H:%M:%S")

Примечание: Это система не имеет dmesg -T и не установлена ​​perl. Я бы предпочел решение w/sed или awk, но python также является опцией.

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

awk -F"]" '{"cat /proc/uptime | cut -d \" \" -f 1" | getline st;a=substr($1,2, length($1) - 1);print strftime("%d/%m/%Y %H:%M:%S",systime()-st+a)" "$0}' 

Или

sed -n 's/\]//;s/\[//;s/\([^.]\)\.\([^ ]*\)\(.*\)/\1\n\3/p' | while read first; do read second; first=`date +"%d/%m/%Y %H:%M:%S" --date="@$(($seconds - $base + $first))"`; printf "[%s] %s\n" "$first" "$second"; done 

Там же питон скрипт в here. Но выдает некоторые ошибки, с которыми я не понимаю.

Спасибо!

+1

так что вы пробовали? Или просто ждать ответа? – BMW

+0

Попробуйте Google, что ... Просто google ваш текущий заголовок ... – hek2mgl

+0

Я сделал, все ответы конвертируют только первый столбец. В некоторых строках есть три временных метки. Команда sed, которую я обнаружил, терпит неудачу в первых двух строках. –

ответ

1

Это немного рискованный, но он должен по крайней мере, дать вам то, чтобы работать с:

awk ' 
    { 
    # tail will be the part of the line that still requires processing 
    tail = $0;        

    # Read uptime from /proc/uptime and use it to calculate the system 
    # start time 
    "cat /proc/uptime | cut -d \" \" -f 1" | getline st; 
    starttime = systime() - st; 

    # while we find matches 
    while((start = match(tail, /\[[^[]*\]/)) != 0) { 
     # pick the timestamp from the match 
     s = substr(tail, start + 1, RLENGTH - 2); 

     # shorten the tail accordingly 
     tail = substr(tail, start + RLENGTH); 

     # format the time to our preference 
     t = strftime("%d/%m/%Y %H:%M:%S", starttime + s); 

     # substitute it into the original line. [] are replaced with || so 
     # the match is not re-replaced in the next iteration. 
     sub(/\[[^[]*\]/, "|" t "|", $0); 
    } 

    # When all matches have been replaced, print the line. 
    print $0 
    }' foo.txt 
Смежные вопросы