У меня есть сценарий bash, который вызывает программу, которая генерирует огромное количество выходных данных. Многие из этих данных поступают из пакета Python, который я еще не создал, и выход которого я не могу контролировать и не интересует.Bash: медленное перенаправление и фильтр
Я попытался отфильтровать вывод, сгенерированный этим внешним пакетом Python, и перенаправить «очищенный» вывод в файл журнала. Если бы я использовал регулярные трубы и выражения grep, я потерял много фрагментов информации. Я читал, что это может произойти с перенаправлением (1 и 2).
Для того, чтобы исправить это, я сделал переназначения так:
#!/bin/bash
regexTxnFilterer="\[txn\.-[[:digit:]]+\]"
regexThreadPoolFilterer="\[paste\.httpserver\.ThreadPool\]"
bin/paster serve --reload --pid-file="/var/run/myServer//server.pid" parts/etc/debug.ini 2>&1 < "/dev/null" | while IFS='' read -r thingy ; do
if [[ ! "$thingy" =~ $regexTxnFilterer ]] && [[ ! "$thingy" =~ $regexThreadPoolFilterer ]]; then
echo "$thingy" >> "/var/log/myOutput.log"
fi
done
Который не теряет какой-либо информации (по крайней мере, не то, что я могу сказать) и фильтрует строки не нужны (используя два регулярных выражения выше).
Проблема в том, что она предоставила приложение (bin/paster
вещь, которую я выполняю) невыносимо медленно. Есть ли способ добиться такого же эффекта, но с лучшей производительностью?
Спасибо заранее!
Update @ 2012-04-13: Как shellter отметил в одном из комментариев на этот вопрос, может быть полезно привести примеры выходов, которые я хочу, чтобы отфильтровать. Вот связка из них:
2012-04-13 19:30:37,996 DEBUG [txn.-1220917568] new transaction
2012-04-13 19:30:37,997 DEBUG [txn.-1220917568] commit <zope.sqlalchemy.datamanager.SessionDataManager object at 0xbf4062c>
2012-04-13 19:30:37,997 DEBUG [txn.-1220917568] commit
Starting server in PID 18262.
2012-04-13 19:30:38,292 DEBUG [paste.httpserver.ThreadPool] Started new worker -1269716112: Initial worker pool
2012-04-13 19:33:08,158 DEBUG [txn.-1244144784] new transaction
2012-04-13 19:33:08,158 DEBUG [txn.-1244144784] commit
2012-04-13 19:32:06,980 DEBUG [paste.httpserver.ThreadPool] Added task (0 tasks queued)
2012-04-13 19:32:06,980 INFO [paste.httpserver.ThreadPool] kill_hung_threads status: 10 threads (0 working, 10 idle, 0 starting) ave time N/A, max time 0.00sec, killed 0 workers
Там в нескольких более различных сообщениях, вовлекающих ThreadPool, хотя, но я не мог поймать любого.
Рассмотрите возможность обновления вашего вопроса, чтобы включить некоторые значения образца для $ thingy, которые вы хотите пропустить. Я предполагаю, что есть более эффективный reg-ex, который можно применить к вашему делу. Кроме того, рассмотрите использование 'sed' в качестве вашего фильтра вместо цикла' while read thingy'. Удачи. – shellter
Хм. более сложный, чем я ожидал. Можете ли вы переиздать и добавить окончательный блок, например, требуемый вывод, учитывая 10 строк, которые вы опубликовали. Является ли «запуск сервера ...» действительно ли это собственной отдельной линией? Удачи. – shellter
oh, еще одна вещь, которую вы можете сделать сразу, чтобы ускорить ваше регулярное выражение, предполагает, что ваш заголовок журнала «всегда» похож на «2012-04-13 19: 30: 37,996 DEBUG» - это привязать reg ex к перед линией, и укажите любые 30 символов, т. е. '/ ^. \ {30 \} \ [txn \ .- [[: digit:]] + \]'. Возможно, вам придется экспериментировать, может быть, это действительно '/ ^. {30} /' (без экранирования '\' символов перед {}. ИЛИ наихудший случай '/^........... ................... \ [txn \ .- [[: digit:]] + \] /. 'Я все еще думаю, что' sed' - лучший инструмент для это для вашей строки INFO, напомните, что '.?' означает ноль или один из символов preceing. Удачи. – shellter