Я когда-то должен проверить некоторые журналы, и я делаю это с этой командой:
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
Я хотел бы знать, знает ли кто-то способ сделать это с более короткой командой?
Перед выяснением, почему я хотел бы сделать это с другой командой... Никакая особая причина, мне просто любопытно :)
Нет, я думаю, что Вы так хороши, как это добирается. Естественно, Вы могли сделать это с одним сценарием жемчуга,
perl -nle 's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END { print "$_ $a{$_}" for keys %a } ' test.txt
... но это более сложно и менее интуитивно.
Вы можете написать простой скрипт bash, а затем вызвать скрипт, например:
#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c
и сохранить его как (например) myscript.sh
. Затем сделайте chmod +x myscript.sh
, и вы можете назвать его как myscript.sh <filename>
.
Вот способ awk
сделать это
awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc
Но все эти лайнеры будут немного длиннее, чем наш старый добрый grep
Не намного короче, но поскольку вам не нужно регулярное выражение, есть fgrep
(grep -F
).
fgrep 'success
error
fail' "$filename" | sort | uniq -c
другой способ написать то же самое в bash:
fgrep success\nerror\nfail' "$filename" | sort | uniq -c
Это может быть фиктивный ответ, но я думаю, что в этом случае sort
совершенно бесполезен; может быть, вы можете опустить это. Тем не менее, здесь мы используем три разные команды для трех разных действий.
Мы можем сократить его, если некоторые из них могут быть достигнуты с какой-либо опцией grep
, но я не вижу, какой ...:)
Ваша команда, хотя и короткая и приятная, является довольно окольным способом подсчета вхождений термина. Я бы, вероятно, использовал тупой, прямой подход и использовал бы флаг -c grep (который делает именно это) внутри цикла оболочки:
for i in success test fail; do echo `grep -c $i <filename>` $i; done
Не такой короткий, не такой захватывающий, потенциально более быстрый для больших лог-файлов (нет sort
). Я бы сказал, что это мытье.