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

TayshaunS
quelle
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
slm
quelle
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 ...


quelle
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.

Dunkles Herz
quelle