Zählen Sie die Datensätze, die dem Muster mit Awk entsprechen


11

Also wurde mir gesagt, dass ich last > lastloggedineine Datei erstellen soll, die die letzte Anmeldung der Klasse seit dem letzten Systemneustart anzeigt, und jetzt werde ich gebeten, ein Awk-Skript mit dem Namen zu schreiben myawk, das zählt / bestimmt, wie viele Zeilen lastloggedindie Zeichenfolge enthalten CFS264.

Ich habe es getan grep -c CFS264 lastloggedin


Müssen Sie verwenden awk? Wenn nicht, könnten Sie einfach verwenden grep -c CFS264 lastloggedin | wc -l.
Axel

2
@Axel: grep -c (something) (something) | wc -lwird immer "1" erzeugen.
G-Man sagt "Reinstate Monica"

Antworten:


20

Um Ihnen den Einstieg zu erleichtern, können Sie awkin einer Datei nach Zeilen suchen, die eine Zeichenfolge wie folgt enthalten:

$ awk '/CFS264/ { .... }' lastloggedin

Die Bits in { .... }sind die Befehle, die erforderlich sind, um die Anzahl der Zeilen mit dieser Zeichenfolge zu ermitteln. Um zu bestätigen, dass das oben genannte funktioniert, können Sie ein print $0In verwenden, um einfach die Zeilen zu drucken, die die Suchzeichenfolge enthalten.

$ awk '/CFS264/ { print $0 }' lastloggedin

Wenn Sie nach "awk counter" suchen, werden Sie auf diese SO-Frage und Antwort stoßen : Verwenden Sie awk, um keine Datensätze zu zählen . Die dort gezeigte Methode würde für das, was Sie beschreiben, ausreichen:

$ awk '/CFS264/ {count++} END{print count}' lastloggedin

Beispiel

$ last > lastloggedin

$ awk '/slm/ {count++} END {print count}' lastloggedin 
758

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

HINWEIS: Sie sagen nicht, zu welchem ​​Feld CFS264 in der lastAusgabe gehört. Angenommen, es ist ein Benutzername, dann könnten Sie den awkBefehl weiter einschränken , um nur dieses Feld wie folgt zu durchsuchen:

$ awk '$1=="CFS264" { print $0 }' lastloggedin

Entschuldigung, cfs264 ist Teil eines Benutzernamens. Vielen Dank, dass ihr euch die Zeit genommen habt, mir dabei zu helfen, das herauszufinden. Ich war ziemlich verwirrt und frustriert.
TayshaunS

@TayshaunS - np, du bist herzlich willkommen, danke für das Q und viel Glück mit awk.
slm

4

Das folgende Beispiel zählt die Zeiten, in denen ich erwähnt werde, ohne die lastloggedinDatei zu benötigen :

$ last | awk '$1=="yeti" { ++count } END { print count }' 
106

Wenn Sie darauf bestehen, die lastloggedinDatei zu verwenden, oder gezwungen sind, sie zu verwenden , können Sie dies folgendermaßen tun:

$ last > lastloggedin
$ awk '$1=="yeti" { ++count } END { print count }' lastloggedin
106

Verwenden Sie $1~/some_chars/diese Option , um alle Benutzernamen abzurufen, die die angegebenen Zeichen enthalten, oder $1~/^prefix/um nur Namen abzugleichen, die mit prefix: beginnen.

$ last | awk '$1~/et/ { ++count } END { print count }'
106
$ last | awk '$1~/^ye/ { ++count } END { print count }'
106


PS:

Nach man awkweiteren Hinweisen suchen ... ;-)

awk ist sehr lohnend: Sie können nach sehr kurzer Zeit viel lernen ...


1

Letzte Dose enthält Benutzeranmeldungen von früheren Neustarts. Daher werden im Folgenden nur Benutzer seit dem letzten Neustart gedruckt:

last | awk 'NR==1,$1=="reboot"{if ($1 ~ /cfs264/ ) { count+=1; }}END{ print count; }'

Der erste Teil des Befehls awk gibt einen Bereich an - beginnen Sie in der ersten Zeile, bis die erste Spalte "Neustart" lautet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.