Ich versuche, awk zu verwenden, um die Anzahl der Vorkommen des Wortes "block" und "access" oben in einem Befehl zu zählen.
Ich habe zuerst das Wort "Block" ausprobiert, aber mein Zähler scheint nicht zu funktionieren. Kann jemand sehen, wo mein Code falsch ist?
%Vor%Verwenden Sie ein Array
%Vor% Wenn Sie speziell "blocken" wollen: END {print count["BLOCK"]}
Der Grund dafür, dass Ihr Code möglicherweise nicht funktioniert, ist END
unterscheidet zwischen Groß- und Kleinschreibung, daher prüft Ihr Skript die Variable end
exists (was nicht der Fall ist) und der letzte Block wird nie ausgeführt.
Wenn Sie das ändern, sollte es funktionieren.
Sie benötigen auch nicht den BEGIN
-Block, da alle Variablen bei 0 instanziiert werden.
Unten habe ich einen alternativen Weg hinzugefügt, den Sie stattdessen verwenden könnten.
Dies ist ähnlich wie glenn's, aber nimmt nur die Wörter gefangen, die Sie wollen, es sollte deshalb wenig Speicher verwenden.
Mit Gawk (für den dritten Arg des Matches)
%Vor% Dieser Block wird nur ausgeführt, wenn BLOCK
oder ALLOW
im dritten Feld enthalten sind.
Die Übereinstimmung erfasst, was mit dem Array b verglichen wurde.
Dann wird Array a für das übereinstimmende Feld inkrementiert.
Im Block END
wird jedes erfasste Feld mit einer Anzahl von Vorkommen ausgegeben.
Die Ausgabe ist
%Vor%Hier ist eine Nicht-Code-Lösung. Sie können die Schritte mit Pipes ("|") aneinanderreihen.
%Vor% Katzendatei
lese die Datei und sende sie an stdout (das nächste Programm in der Pipe
awk '{Druck $ 3}'
Drucken Sie die 3. Spalte, das Standard-Trennzeichen in awk ist Leerraum.
sortieren
Sortiere die Ergebnisse
uniq -c
Zählen Sie die Anzahl der Wiederholungen
Der Fehler in Ihrem awk
Aufruf ist, dass Sie in Ihrem "END" -Block print $count
haben. Das nimmt den Inhalt der count
-Variablen, nimmt an, dass es eine ganze Zahl ist, und versucht, das entsprechende Feld in der letzten Zeile der Eingabe zu finden. Was Sie wirklich wollen, ist nur print count
, da dies nur den Wert in der Variable count
ausgibt. Es ist manchmal einfach, verschiedene Variablenreferenzierungsschemata zwischen bash
, awk
, python
usw. zu mischen, daher ist es ein leichter Fehler, dies zu tun.