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

8

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

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

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

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

Волчок
источник

Ответы:

4

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

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

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

devav2
источник
4

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

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

... но это более сложный и менее интуитивно понятный.

январь
источник
Я добавил пример ввода в свой вопрос ... Надеюсь, теперь стало понятнее, что делает команда ... извините за неудобства
Wolfy
1
ОК, я изменил perl oneliner соответственно. Я все еще думаю, что ваше решение с egrep лучше и интуитивно понятнее.
января
2

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

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

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

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c
Кодзиро
источник
1

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

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

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

jeremija
источник
Но в этом случае команда та же самая ... вы только что создали скрипт, который вызывает команду ...
Wolfy
Я думал, что вы просто хотели ускорить просмотр ваших журналов. Просто любопытно, зачем вам альтернативная команда, если та, которую вы уже предоставили, хорошо вам подходит?
Иеремия
как я сказал: мне просто любопытно, как другие делают что-то подобное ... много раз я понимал, что люди знают какой-то причудливый / хороший способ делать вещи, и я люблю учить сейчас способы делать вещи ...
Вольф
2
В этом случае вы тот человек :-) Ваша командная строка приятна, лаконична, понятна и использует всю мощь командной строки Unix. Чего еще желать?
января
0

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

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

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

троичный
источник
-1

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

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

Алессио Томеллери
источник
2
Нет, это не так, в противном случае uniq будет считать только последовательные экземпляры поисковых терминов. Например, если у вас есть успех, успех, неудача, успех, то вывод Uniq будет 2 success 1 fail 1 success.
января
ничего страшного ... sry
Алессио Томельери