Альтернативы для 'egrep-o “success|error|fail” <имя файла> | вид | uniq-c'

Я когда-то должен проверить некоторые журналы, и я делаю это с этой командой:

egrep -o "success|error|fail" <filename> | sort | uniq -c

Демонстрационный вход:

test error on line 10
test connect success
test insert success
test started at 00:00
test delete  fail

Демонстрационный вывод:

1 error
1 fail
2 success

Я хотел бы знать, знает ли кто-то способ сделать это с более короткой командой?

Перед выяснением, почему я хотел бы сделать это с другой командой... Никакая особая причина, мне просто любопытно :)

8
задан 17 September 2012 в 12:02

6 ответов

Нет, я думаю, что Вы так хороши, как это добирается. Естественно, Вы могли сделать это с одним сценарием жемчуга,

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

... но это более сложно и менее интуитивно.

4
ответ дан 17 September 2012 в 12:02

Вы можете написать простой скрипт bash, а затем вызвать скрипт, например:

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

и сохранить его как (например) myscript.sh. Затем сделайте chmod +x myscript.sh, и вы можете назвать его как myscript.sh <filename>.

0
ответ дан 17 September 2012 в 12:02

Вот способ awk сделать это

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

Но все эти лайнеры будут немного длиннее, чем наш старый добрый grep

0
ответ дан 17 September 2012 в 12:02

Не намного короче, но поскольку вам не нужно регулярное выражение, есть fgrep (grep -F).

fgrep 'success
error
fail' "$filename" | sort | uniq -c

другой способ написать то же самое в bash:

fgrep success\nerror\nfail' "$filename" | sort | uniq -c
0
ответ дан 17 September 2012 в 12:02

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

Мы можем сократить его, если некоторые из них могут быть достигнуты с какой-либо опцией grep, но я не вижу, какой ...:)

0
ответ дан 17 September 2012 в 12:02

Ваша команда, хотя и короткая и приятная, является довольно окольным способом подсчета вхождений термина. Я бы, вероятно, использовал тупой, прямой подход и использовал бы флаг -c grep (который делает именно это) внутри цикла оболочки:

for i in success test fail; do echo `grep -c $i <filename>` $i; done

Не такой короткий, не такой захватывающий, потенциально более быстрый для больших лог-файлов (нет sort). Я бы сказал, что это мытье.

0
ответ дан 17 September 2012 в 12:02

Другие вопросы по тегам:

Похожие вопросы: