Alternative a 'egrep -o “success | error | fail” <nomefile> | ordina | uniq -c '


8

A volte ho bisogno di controllare alcuni registri e lo faccio con questo comando:

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

Input di esempio:

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

Uscita campione:

1 error
1 fail
2 success

Vorrei sapere se qualcuno conosce un modo per farlo con un comando più breve?

Prima di chiedere perché mi piacerebbe farlo con un comando diverso ... Nessun motivo speciale, sono solo curioso :)

Risposte:


4

Ecco il awkmodo di farlo

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

Ma tutte queste fodere saranno un po 'più lunghe del nostro buon vecchio grep


4

No, penso che tu sia bravo come si arriva. Naturalmente, potresti farlo con uno script perl,

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

... ma è più complesso e meno intuitivo.


Ho aggiunto un input di esempio alla mia domanda ... Spero che ora sia più chiaro cosa fa il comando ... sory per l'inconveniente
Wolfy,

1
OK, ho modificato il perl oneliner di conseguenza. Penso ancora che la tua soluzione con egrep sia migliore e più intuitiva.
Gennaio

2

Non molto più breve, ma poiché non hai davvero bisogno dell'espressione regolare, c'è fgrep( grep -F).

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

un altro modo di scrivere la stessa cosa in bash:

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c

1

Potresti scrivere un semplice script bash e quindi chiamare lo script, come:

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

e salvarlo come (ad esempio) myscript.sh. Quindi fai un chmod +x myscript.she puoi chiamarlo come myscript.sh <filename>.


Ma in questo caso il comando è lo stesso ... hai appena creato uno script che chiama il comando ...
Wolfy,

Pensavo volessi solo velocizzare il grepping dei tuoi log. Solo curioso, perché vuoi un comando alternativo se quello che hai già fornito fa un buon lavoro per te?
jeremija,

come ho detto: sono solo curioso di sapere come gli altri fanno qualcosa del genere ... molte volte mi sono reso conto che le persone conoscono un modo elegante / carino per fare le cose e adoro imparare ora come fare le cose ...
Wolfy,

2
In tal caso, sei quella persona :-) La tua linea di comando è bella, concisa, chiara e sfrutta la potenza della linea di comando Unix. Cos'altro desiderare?
Gennaio

0

Il tuo comando, sebbene breve e dolce, è un modo piuttosto tortuoso di contare le occorrenze di un termine. Probabilmente prenderei l'approccio diretto e diretto e userei il flag -c di grep (che fa esattamente quello) all'interno di un loop shell:

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

Non così breve, non così eccitante, potenzialmente più veloce per file di log di grandi dimensioni (no sort). Direi che è un lavaggio.


-1

Questa potrebbe essere una risposta fittizia ma penso che, in questo caso, sortsia abbastanza inutile; forse puoi ometterlo. Tuttavia qui stiamo usando tre diversi comandi per tre diverse azioni.

Possiamo cortocircuitare se alcuni di essi possono essere raggiunti con qualche opzione di grep, ma non vedo quale ... :)


2
No, non lo è, altrimenti uniq conterà solo istanze consecutive di termini di ricerca. Ad esempio se hai successo, successo, fallimento, successo, allora l'output di uniq sarà 2 success 1 fail 1 success.
Gennaio

va bene ... sry
Alessio Tomelleri il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.