Czasami muszę sprawdzić niektóre dzienniki i robię to za pomocą tego polecenia:
egrep -o "success|error|fail" <filename> | sort | uniq -c
Przykładowe dane wejściowe:
test error on line 10
test connect success
test insert success
test started at 00:00
test delete fail
Przykładowe dane wyjściowe:
1 error
1 fail
2 success
Chciałbym wiedzieć, czy ktoś wie, jak to zrobić za pomocą krótszego polecenia?
Zanim zapytasz, dlaczego chciałbym to zrobić innym poleceniem ... Nie ma specjalnego powodu, jestem po prostu ciekawy :)
command-line
grep
alternative
Wolfy
źródło
źródło
Niewiele krótszy, ale ponieważ tak naprawdę nie potrzebujesz wyrażenia regularnego, jest
fgrep
(grep -F
).inny sposób na napisanie tego samego w bash:
źródło
Możesz napisać prosty skrypt bash, a następnie wywołać skrypt, na przykład:
i zapisz jako (na przykład)
myscript.sh
. Następnie zrób achmod +x myscript.sh
i możesz to tak nazwaćmyscript.sh <filename>
.źródło
Twoje polecenie, choć krótkie i słodkie, jest raczej okrężnym sposobem liczenia wystąpień danego terminu. Prawdopodobnie wybrałbym tępe, bezpośrednie podejście i użyłem flagi grep -c (która robi dokładnie to) wewnątrz pętli powłoki:
Nie tak krótki, nie tak ekscytujący, potencjalnie szybszy dla dużych plików dziennika (nie
sort
). Powiedziałbym, że to pranie.źródło
To może być fałszywa odpowiedź, ale myślę, że w tym przypadku
sort
jest całkiem bezużyteczna; może możesz to pominąć. Niemniej jednak tutaj używamy trzech różnych poleceń dla trzech różnych działań.Możemy to skrócić, jeśli niektóre z nich zostaną osiągnięte z opcją
grep
, ale nie widzę, która ... :)źródło
2 success 1 fail 1 success
.