Использование sed / awk и regex для обработки журналов - PullRequest
1 голос
/ 10 августа 2011

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

###Unknown no of lines, which I want to ignore###
=================================================
$insert_vars['cdr_pkey']=17568
$id<TAB>$g1<TAB>$i1<tab>rating1<TAB>$g2<TAB>$i2<tab>rating2 #<TAB>more $gX,$iX,$ratingX
#numerical values of $id $g1 $i1 etc. separated by tab
#numerical values of ---""---
#I do not know how many lines will be there (unique column is $id)
=================================================
###Unknown no of lines, which I want to ignore###

Я должен обработать эти файлы журналов и создать таблицу Excel (я думаю, формат CSV) и сообщить данные обратно.Я действительно плох в Excel, но я думал о выводе что-то вроде:

cdr_pkey<TAB>id<TAB>g1<TAB>i1<TAB>rating1<TAB>g2<TAB>rating2 #and so on
17568<TAB>1349<TAB>0.0004532<TAB>0.01320<TAB>2.014E-4<TAB>...#rest of numerical values
17568<TAB>1364<TAB>...#values for id=1364
17568<TAB>1321<TAB>...#values for id=1321
...
17569<TAB>1048<TAB>...#values for id=1048
17569<TAB>1426<TAB>...#values for id=1426
...
...

Так что мой cdr_pkey является уникальным столбцом на листе, и для каждого $cdr_pkey у меня есть несколько $id с, каждыйимея собственный набор $g1,$i1,$rating1...
После тестирования такого формата он может быть прочитан в Excel.Теперь я просто хочу распространить его на все эти тысячи файлов.
Я просто не уверен, что делать дальше.Какой следующий шаг?

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Следующий скрипт bash делает что-то, что может быть связано с тем, что вы хотите. Это параметризовано тем, что вы имели в виду, когда сказали <TAB>. Я предполагаю, что вы имеете в виду символ табуляции ascii, но если ваши журналы настолько многословны, что в них прописано <TAB>, вам нужно соответственно изменить переменную $WHAT_DID_YOU_MEAN_BY_TAB. Обратите внимание, что в этом скрипте очень мало того, что делает The Right Thing ™; он читает весь файл в строковую переменную, что может быть невозможно даже в зависимости от размера ваших файлов журнала. С другой стороны, сценарий можно легко изменить, сделав два прохода, если вы считаете, что это лучше.

#!/bin/bash

WHAT_DID_YOU_MEAN_BY_TAB='\t'

if [[ $# -ne 1 ]] ; then echo "Requires one argument: the file to process" ; exit 1 ; fi

FILENAME="$1"

RELEVANT=$(sed -n '/^==*$/,/^==*$/p' "$FILENAME" | sed '1d' | head -n '-1')
CDR_PKEY=$(echo "$RELEVANT" | \
    grep '$insert_vars\['"'cdr_pkey'\]" | \
    sed 's/.*=\(.*\)/\1/')
echo "$RELEVANT" | sed '1,2d' | \
    sed "s/.*/${CDR_PKEY}$WHAT_DID_YOU_MEAN_BY_TAB\0/"

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

find . LOG_PATTERN -exec THIS_SCRIPT '{}' \;

Наконец, я проигнорировал проблему размещения заголовков CSV на выходе. Это легко сделать внеполосным.

(Изменить: обновлен скрипт, чтобы отразить обсуждение в комментариях.)

1 голос
/ 10 августа 2011

РЕДАКТИРОВАТЬ: Джеймс говорит мне, что изменение sed в последнем echo с ... 1d ... на ... 1,2 ... и сброс grep -v 'id' должны помочь.
Подтвердил, что это работает.Так что меняем его ниже.Еще раз спасибо Джеймсу Уилкоксу.


По сценарию @James я и придумал.Я только что передал последнее эхо на grep -v 'id'
Еще раз спасибо Джеймс Уилкокс
WHAT_DID_YOU_MEAN_BY_TAB='\t'

if [[ $# -lt 1 ]] ; then echo "Requires at least one argument: the files to process" ; exit 1 ; fi

echo -e "key\tid\tg1\ti1\td1\tc1\tr1\tg2\ti2\td2\tc2\tr2\tg3\ti3\td3\tc3\tr3"

for i in "$@"
do
    FILENAME="$i"
    RELEVANT=$(sed -n '/^==*$/,/^==*$/p' "$FILENAME" | sed '1d' | head -n '-1')
    CDR_PKEY=$(echo "$RELEVANT" | \
        grep '$insert_vars\['"'cdr_pkey'\]" | \
        sed 's/.*=\(.*\)/\1/')
    echo "$RELEVANT" | sed '1, 2d' | \
        sed "s/.*/${CDR_PKEY}$WHAT_DID_YOU_MEAN_BY_TAB\0/"
    #the one with grep looked like :-
    #echo "$RELEVANT" | sed '1d' | \
        #sed "s/.*/${CDR_PKEY}$WHAT_DID_YOU_MEAN_BY_TAB\0/" | grep -v 'id'
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...