2016-06-28 5 views
0

Иногда полезно иметь подробные журналы для глазного яблока, но больно извлекать данные для чтения. НапримерLinux Scripting - лучший способ извлечения данных на основе шаблонов из подробных журналов

10:16:43.002 EVENT [ID = 1013] Order fill with quantity 115 and price 74.42 for owner 234 

Я хочу, чтобы извлечь 10: 16: 43,002, 1013, 115, 74,42 из приведенных выше строк журнала в файл CSV. Поэтому я могу проанализировать их вместе.

Есть ли общее решение? В общем случае я имею в виду, что могу привести несколько подробных английских строковых шаблонов. Я бы предпочел не считать символы или номера полей.

Узор идеале быть как

TT EVENT [ID = AA] Order fill with quantity BB and price CC for owner DD 

Я хочу, чтобы извлечь TT, AA, BB, CC, DD

+0

Каков шаблон здесь? – Inian

+0

Вы можете использовать 'sed' и некоторые регулярные выражения и сохранять их в разные переменные, а затем просто объединять их вместе. Кажется, что данные имеют одинаковый формат для каждой строки, поэтому он будет работать. https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html –

+0

Есть несколько отличных инструментов для работы - см. 'libgrok' и [на основе этого, как полный стек для делая массовое извлечение структурированных данных из журналов с индексированием и анализом через ElasticSearch] Logstash. Тем не менее, поскольку запросы на рекомендации по инструментам явно не соответствуют теме, я не уверен, что могу ответить на этой основе в рамках области. –

ответ

0

С СЕПГ:

$ sed -E 's/(.*) EVENT \[ID = (.*)\] Order fill with quantity (.*) and price (.*) for owner (.*)/\1,\2,\3,\4/' file 
10:16:43.002,1013,115,74.42 

или GNU AWK для gensub():

$ gawk '{ print gensub(/(.*) EVENT \[ID = (.*)\] Order fill with quantity (.*) and price (.*) for owner (.*)/,"\\1,\\2,\\3,\\4",1) }' file 
10:16:43.002,1013,115,74.42 

или также с GNU AWK для 3-арг, чтобы соответствовать():

$ cat tst.awk 
BEGIN { OFS = "," } 
match($0,/(.*) EVENT \[ID = (.*)\] Order fill with quantity (.*) and price (.*) for owner (.*)/,a) { 
    for (i=1;i in a;i++) { 
     printf "%s%s", (i>1 ? OFS : ""), a[i] 
    } 
    print "" 
} 

$ gawk -f tst.awk file 
10:16:43.002,1013,115,74.42,234 

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

1

Попробуйте это:

sed -r 's/^([0-9:\.]+).* \[ID = ([0-9]+).*quantity ([0-9]+).*price ([0-9\.]+).*owner ([0-9\.]+)/\1;\2;\3;\4;\5/' file 

Выход:

10:16:43.002;1013;115;74.42;234 
0

Не уверен, что это то, что y ou ищут, но слова без цифр можно удалить и заменить;

sed 's/[^[:digit:]]* /,/g' 
0

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

$ cat log|scan "%s EVENT [ID = %d] Order fill with quantity %d and price %f for owner %s" 
10:16:43.002,1013,115,74.42,234 

утилита scan имеет простую реализацию в Tcl:

сканирование:

#!/usr/bin/tclsh 

set fmt [lindex $argv 0] 
append fmt %n 
while { [gets stdin line] >= 0 } { 
    set fields [scan $line $fmt] 
    if { [lindex $fields end] == [string length $line] } { 
     puts [join [lrange $fields 0 end-1] ,] 
    } 
}