2016-03-21 2 views
1

Вот простая общая спецификация моего лога:Как отфильтровать определенные закономерности в пределах нескольких/разделенных линий

  • один запрос приходит, журналы ...[XXXHandler] comming time...
  • прибудет замок и начать транзакции, журналы ...[XXXHandler] [UID] start time...
  • бизнес готово и вернуть замок, бревна ...[XXXHandler] [UID] spend time...

На практике существует т-х запросов заподлицо с использованием соответствующего UID и шаблоном три линии заставленного друг в друг. Вот часть этого:

~ cat sample.log 
[240] [DeleteAllLettersHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [DeleteAllLettersHandler] [13497] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [DeleteAllLettersHandler] [13497] spend time [1] dbs 1 dbu 1 | {} 
[240] [StartBiddingAllianceBossAuctionHandler] [1495] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [GetMazeMainInfoHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] [1495] spend time [1] dbs 1 dbu 0 | {} 
[240] [GetMazeMainInfoHandler] [8941] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [GetResHarvestInfoHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [GetResHarvestInfoHandler] [1807] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [RCHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016]  ## gotcha 
[240] [GetMazeMainInfoHandler] [8941] spend time [10] dbs 27 dbu 2 | {} 
[240] [GetResHarvestInfoHandler] [1807] spend time [5] dbs 15 dbu 4 | {} 
[240] [StartBiddingAllianceBossAuctionHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] [18052] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] [18052] spend time [1] dbs 1 dbu 0 | {} 
[240] [GetResourceAmount] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [GetResourceAmount] [29063] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [GetResourceAmount] [29063] spend time [1] dbs 3 dbu 0 | {} 

Мое требование, чтобы отфильтровать журнал, удалите суматоху три линии модели в то время как я могу видеть, какой обработчик висит (журналы, приходящие, но нет времени начала).


Вот мое решение:

- cat process.sh 

sed -r ' 
    $!N 
    $!N 
    $!N 
    s/(([^\n]*\n)*)[^\n]*\[([^\n]*)\] coming time[^\n]*\n(([^\n]*\n)*)[^\n]*\[\3\] \[([^\n]*)\] start time[^\n]*\n(([^\n]*\n)*)[^\n]*\[\3\] \[\6\] spend time[^\n]*(.*)/\1\4\7\9/ 
    t print  
    P 
    D 

    :print 
' | 

grep -v '^ *$' 

Это может фильтровать некоторые образцы, но не все это, так как СЭД может обрабатывать один шаблон рассеянного в три или четыре (с SED раундом добавляет может быть больше).

~ ./process.sh < sample.log 
[240] [StartBiddingAllianceBossAuctionHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] [1495] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [GetMazeMainInfoHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] [1495] spend time [1] dbs 1 dbu 0 | {} 
[240] [GetMazeMainInfoHandler] [8941] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [RCHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016]  ## gotcha 
[240] [GetMazeMainInfoHandler] [8941] spend time [10] dbs 27 dbu 2 | {} 
[240] [StartBiddingAllianceBossAuctionHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] [18052] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [StartBiddingAllianceBossAuctionHandler] [18052] spend time [1] dbs 1 dbu 0 | {} 

Используя отфильтрованные журналы, как SEED, фильтровать ее снова и снова, я могу получить результат я хочу:

~ ./process.sh < sample.log | ./process.sh 
[240] [GetMazeMainInfoHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [GetMazeMainInfoHandler] [8941] start time [Fri Mar 18 05:00:00 GMT-06:00 2016] 
[240] [RCHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016]  ## gotcha 
[240] [GetMazeMainInfoHandler] [8941] spend time [10] dbs 27 dbu 2 | {} 

~ ./process.sh < sample.log | ./process.sh | ./process.sh 
[240] [RCHandler] coming time [Fri Mar 18 05:00:00 GMT-06:00 2016]  ## gotcha 

Похоже, что я просто должен фильтровать еще несколько раз получить результат в конечном итоге мне нужно. Поэтому я задал один вопрос: shell pipe process repeat, Ответ на @tripleee отлично подходит для меня. Примерно через пять раз я могу получить окончательный результат для каждого журнала.


Но слишком много времени, один 10-строчный журнал обычно стоит 10 минут для фильтрации таким образом.

Итак, мой вопрос: можете ли вы найти лучший способ сделать это? или как улучшить свой способ, чтобы он работал быстрее.

Благодарим вас за внимание!

+0

Подсчет времени и времени начала для вас не достаточно? – user3132194

+0

@ user3132194 Мне нужно найти, какой проводник там висит. – hedleyyan

+0

Если обработчик, который был висел, никогда не запускается снова, вы можете упростить задачу, получив * последнее появление * каждого обработчика и проверить, содержит ли он '' '' время наступления'''. – dekkard

ответ

0

Я не думаю, что bash компетентен в вашем вопросе.

Я хотел бы рекомендовать вам попробовать perl. Разбор журнала и сохранение [Имя обработчика, вопрос, начало, конец] четыре раза в хэш-таблицу, тогда вы можете сканировать хеш-таблицу, чтобы найти, какой обработчик висит. Это более расширяемое решение, ИМХО.

+0

Thx за ваш совет! Я не использую perl или другой язык переходов по двум причинам: 1. В трех шаблонах линий, которые мне полезны, есть другая информация в журнале, я должен оставаться ими. 2. один определенный [XXHandler] [UID] ... может возникать несколько раз, а комбинации обработчика и UID взорваны. если я использую хэш, чтобы помочь мне фильтровать шаблон, я также сомневаюсь в эффективности. Thx в любом случае, также я хочу увидеть, есть ли другое деликатное решение. – hedleyyan

+0

@HedleyYan. Чем сложнее ваша задача, тем разумнее использовать передний язык. – gzh

+0

Да, вы правы, THX – hedleyyan

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