Вот простая общая спецификация моего лога:Как отфильтровать определенные закономерности в пределах нескольких/разделенных линий
- один запрос приходит, журналы
...[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 минут для фильтрации таким образом.
Итак, мой вопрос: можете ли вы найти лучший способ сделать это? или как улучшить свой способ, чтобы он работал быстрее.
Благодарим вас за внимание!
Подсчет времени и времени начала для вас не достаточно? – user3132194
@ user3132194 Мне нужно найти, какой проводник там висит. – hedleyyan
Если обработчик, который был висел, никогда не запускается снова, вы можете упростить задачу, получив * последнее появление * каждого обработчика и проверить, содержит ли он '' '' время наступления'''. – dekkard