2016-09-15 3 views
1

Учитывая регулярное выражение, я хочу напечатать первое вхождение каждого уникального совпадения с его номером строки с помощью bash.Печать первого вхождения каждого уникального регулярного выражения с номером строки

Например, позволяет сказать, что регулярное выражение .*Exception, я хочу, чтобы напечатать,

$./script.sh file.log 
6255:2016-09-07 10:05:37,886 ERROR some text java.lang.IllegalMonitorStateException 
6714:2016-09-07 10:12:09,514 ERROR some text java.lang.NullPointerException 
7013:2016-09-07 10:19:19,950 ERROR some text java.lang.IllegalStateException 

Я придумал версию, но это очень медленно :((на мерзавца-баш). Любые ссылки на как увеличить производительность оценена

FILE_NAME=$1 

while read line 
do 
    grep "$line" "$FILE_NAME" -m1 -n 
done < <(grep '\b[^ ]*Exception\b' "$FILE_NAME" | sort -u) | sort -n 

Обновление (добавление данных выборок):.

2016-09-07 23:58:55,674 ERROR [STDERR] (pool-18-thread-1) Continuing ... 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.InstantiationException: java.sql.Timestamp 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) Continuing ... 
2016-09-07 23:56:16,273 WARN [com.arjuna.ats.jta.logging.loggerI18N] (Thread-12) [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new(); 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) Continuing ... 
2016-09-07 23:58:26,304 WARN [com.arjuna.ats.jta.logging.loggerI18N] (Thread-12) [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR 

Выше следует производить:

2:2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.InstantiationException: java.sql.Timestamp 
4:2016-09-07 23:56:16,273 WARN [com.arjuna.ats.jta.logging.loggerI18N] (Thread-12) [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR 
5:2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new(); 
+0

Если вы разместите часть этого 'file.log' для тестового материала, я верю больше людей хотели бы попытаться решить вашу проблему. Некоторые хиты и промахи были бы приятными. –

+0

будет приемлемым решение 'perl'? – Sundeep

+0

'perl' должно быть в порядке, пока оно не слишком загадочно. –

ответ

1
$ cat ip.txt 
2016-09-07 23:58:55,674 ERROR [STDERR] (pool-18-thread-1) Continuing ... 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.InstantiationException: java.sql.Timestamp 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) Continuing ... 
2016-09-07 23:56:16,273 WARN [com.arjuna.ats.jta.logging.loggerI18N] (Thread-12) [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new(); 
2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) Continuing ... 
2016-09-07 23:58:26,304 WARN [com.arjuna.ats.jta.logging.loggerI18N] (Thread-12) [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR 

$ perl -ne '($e)=/(\w+Exception)/; print "$.:$_" if !$seen{$e}++ && /Exception/' ip.txt 
2:2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.InstantiationException: java.sql.Timestamp 
4:2016-09-07 23:56:16,273 WARN [com.arjuna.ats.jta.logging.loggerI18N] (Thread-12) [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR 
5:2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new(); 
  • ($e)=/(\w+Exception)/ сохраняет тип исключения в $e переменной
  • !$seen{$e}++ убеждается только первая строка соответствия исключения печатается
  • && /Exception/ печатать только строки, содержащие Exception
  • print "$.:$_" печать номер строки, : и входной линии


Edit:

Это должно работать также и быстрее ...

perl -ne 'if(/(\w+Exception)/){print "$.:$_" if !$seen{$1}++}' ip.txt 
+0

Работайте так, как ожидалось, и производительность тоже лучше. –

1

В Gnu AWK:

$ awk '/Exception/ && !seen[gensub(/^([^ ]*){2}/,"","g")]++ {print NR,$0}' file.log 
2 2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.InstantiationException: java.sql.Timestamp 
4 2016-09-07 23:56:16,273 WARN [com.arjuna.ats.jta.logging.loggerI18N] (Thread-12) [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR 
5 2016-09-07 23:58:55,675 ERROR [STDERR] (pool-18-thread-1) java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new(); 

Распечатать запись если:

  • /Exception/ матчи
  • && и
  • !seen[...]++ ключ не был замечен ранее
  • gensub(/^([^ ]*){2}/,"","g") ключ, созданный удалением от начала ^ до второго места
  • print NR,$0 печать номер текущей записи и записи
Смежные вопросы