Ich habe große Dateien mit HTTP-Zugriffsprotokollen und versuche, Stundenzählungen für eine bestimmte Abfragezeichenfolge zu generieren. Natürlich ist die richtige Lösung, alles in Splunk oder Graylog oder so etwas zu werfen, aber ich kann das alles im Moment nicht für diesen einmaligen Deal einrichten.
Das schnelle und schmutzige ist:
for hour in 0{0..9} {10..23}
do
grep $QUERY $FILE | egrep -c "^\S* $hour:"
# or, alternately
# egrep -c "^\S* $hour:.*$QUERY" $FILE
# not sure which one's better
done
Aber diese Dateien haben durchschnittlich 15 bis 20 Millionen Zeilen, und ich möchte wirklich nicht jede Datei 24 Mal analysieren. Es wäre weitaus effizienter, die Datei zu analysieren und jede Instanz $hour
auf einmal zu zählen. Gibt es eine Möglichkeit, dies zu erreichen?
Sie können grep bitten, den passenden Teil jeder Zeile mit auszugeben -o
und dann uniq -c
die Ergebnisse zu zählen:
grep "$QUERY" "$FILE" | grep -o "^\S* [0-2][0-9]:" | sed 's/^\S* //' | uniq -c
Der sed
Befehl dient dazu, nur die zweistellige Stunde und den Doppelpunkt beizubehalten, die Sie bei Bedarf auch mit einem anderen sed-Ausdruck entfernen können.
Vorsichtsmaßnahmen: Diese Lösung funktioniert mit GNU grep und GNU sed und erzeugt stundenlang keine Ausgabe anstelle von "0" ohne Protokolleinträge. Ein großes Lob an @EdMorton für den Hinweis auf diese Probleme in den Kommentaren und andere Probleme, die in der obigen Antwort behoben wurden.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen