Frage zu awk - Ersatz für grep -c bzw. grep, wc

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
uname
Beiträge: 12076
Registriert: 03.06.2008 09:33:02

Frage zu awk - Ersatz für grep -c bzw. grep, wc

Beitrag von uname » 23.06.2023 13:04:33

Aufgrund dieses Beitrags hätte ich eine kurze Frage zu awk.

Mit

Code: Alles auswählen

dpkg -l | awk ’END { print NR }’
kann ich die Anzahl von Einträgen zählen.

Wie kann ich es hingebekommen, dass ich gleichzeitig mit awk nach etwas suchen kann, mir aber am Ende nur die Gesamtzahl ausgegeben wird. Irgendwie bekomme ich es nicht hin die Suche /irgendwas/ mit END zu kombinieren. Leider habe ich im Internet dafür keine Lösung gefunden.

uname
Beiträge: 12076
Registriert: 03.06.2008 09:33:02

Re: Frage zu awk - Ersatz für grep -c bzw. grep, wc

Beitrag von uname » 23.06.2023 13:08:08

Scheinbar braucht man unbedingt {} und eine eigene Variable. Oder geht das doch einfacher, dass awk automatisch selbst die Treffer zählt?

Code: Alles auswählen

dpkg -l | awk ’/irgendwas/ {i++} END { print i}’

chrbr
Beiträge: 551
Registriert: 29.10.2022 15:53:26

Re: Frage zu awk - Ersatz für grep -c bzw. grep, wc

Beitrag von chrbr » 23.06.2023 13:40:03

Hallo uname,
bei deinem Kommando bekomme ich einen Fehler:

Code: Alles auswählen

~> dpkg -l | awk ’/aspell/ {i++} END { print i}’
awk: 1: unexpected character 0xe2
Passiert das bei dir nicht? Funktionieren tut

Code: Alles auswählen

~> dpkg -l | awk '{if ($0 ~ /aspell/) {i++} } END {print i}'
4
Jedenfalls muss man awk zählen lassen.
Meine awk Version ist

Code: Alles auswählen

 ~> awk -W version
mawk 1.3.4 20200120
Copyright 2008-2019,2020, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan

random-funcs:       srandom/random
regex-funcs:        internal
compiled limits:
sprintf buffer      8192
maximum-integer     2147483647

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Frage zu awk - Ersatz für grep -c bzw. grep, wc

Beitrag von Meillo » 23.06.2023 17:41:41

chrbr hat geschrieben: ↑ zum Beitrag ↑
23.06.2023 13:40:03
Hallo uname,
bei deinem Kommando bekomme ich einen Fehler:

Code: Alles auswählen

~> dpkg -l | awk ’/aspell/ {i++} END { print i}’
awk: 1: unexpected character 0xe2
Passiert das bei dir nicht?
Probier's mal mit normalen und nicht mit typographischen Single-Quotes. ;-)


Nachtrag:

Hier kommt das 0xe2 von der Fehlermeldung her: Es ist das erste Byte der vier Byte langen UTF-8 Kodierung des typographischen Anfuehrungszeichens.

Code: Alles auswählen

:-Q echo ’ | od -tx1
0000000 e2 80 99 0a
0000004
Um das mal genauer zu analysieren: Statt `awk' habe ich in deinem Befehl einfach mal die folgende `printargs'-Funktion eingesetzt. Damit siehst du was fuer Argumente uebergeben werden. Du ueber gibst deinem awk-Aufruf sechs Argumente. Der Befehl enthaelt *keine* Quotes!

Code: Alles auswählen

:-Q printargs() { for i in "$@"; do echo "$i"; done; }

:-Q printargs ’/aspell/ {i++} END { print i}’
’/aspell/
{i++}
END
{
print
i}’
Richtig waere aber genau ein Argument, das das ganze Programm enthaelt:

Code: Alles auswählen

:-Q printargs '{if ($0 ~ /aspell/) {i++} } END {print i}'
{if ($0 ~ /aspell/) {i++} } END {print i}
Zuletzt geändert von Meillo am 23.06.2023 18:07:17, insgesamt 1-mal geändert.
Grund: Nachtrag: Erklaerung
Use ed once in a while!

chrbr
Beiträge: 551
Registriert: 29.10.2022 15:53:26

Re: Frage zu awk - Ersatz für grep -c bzw. grep, wc

Beitrag von chrbr » 23.06.2023 18:30:03

Meillo hat geschrieben: ↑ zum Beitrag ↑
23.06.2023 17:41:41
Probier's mal mit normalen und nicht mit typographischen Single-Quotes. ;-)
Kaum macht man's richtig - schon geht's.

Ach, wie ich diese "Schweinehaken" hasse. Das typographische ' lässt sich am einfachsten eingeben. Nun habe ich das mal mit Gänsefüßchen probiert. Das funktioniert auch.

Code: Alles auswählen

 ~> dpkg -l | mawk "/aspell/ {i++} END { print i}"
4
Hauptsache, das awk Programm bleibt ein Stück. Hier sind die Leerzeichen maskiert. Irgendie laufen viele Probleme doch auf das Quoten hinaus.

Code: Alles auswählen

~> dpkg -l | mawk /aspell/\ {i++}\ END\ {\ print\ i}
4
Vielen Dank Meillo, da hat sich eine Baustelle geschlossen.

Antworten