[gelöst] Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

[gelöst] Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von bivvo » 29.12.2021 18:05:20

Hi, ich ziehe mir einen Auszug aus nem Docker Log.
Diesen möchte ich in einer Variable zwischenspeichern und dann weiter analysieren.

Code: Alles auswählen

LOG1H="docker logs --since "$(date -d "$date -1 hour" +"%Y-%m-%dT%H:%M")" $NODENAME"
INFO="$($LOG1H 2>&1 | grep 'INFO' | grep -v -e 'FATAL' -e 'ERROR')"
tmp_info="$(echo $INFO 2>&1 | grep 'INFO' | grep -v -e 'FATAL' -e 'ERROR' -c)"
Bis zur dritten Zeile funktioniert das prima. Allerdings funktioniert der Count -c nicht gescheit.
Es sind etwa 5.500 Einträge vorhanden, aber in tmp_info wird nur 1 oder 0 gespeichert.

Beispielhafter Auszug aus INFO:

Code: Alles auswählen

2021-12-29T16:45:51.748Z	INFO	piecestore	uploaded	{"Piece ID": "xxx", "Satellite ID": "xxx", "Action": "PUT", "Size": 6912}
Habt ihr einen Tipp für mich, woran es liegen kann?
Gibt es eine Größenbeschränkung für das Befüllen der Variablen (hier INFO)?
Zuletzt geändert von bivvo am 22.07.2022 16:58:00, insgesamt 1-mal geändert.

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

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von Meillo » 29.12.2021 18:09:28

Zuerst mal solltest du die Variablenexpansion $INFO double-quoten.

Wenn das noch nicht ausreicht, dann waere es gut, wenn du mal erklaeren koenntest, was diese dritte Zeile genau machen soll. (Wenn du nur die INFO-Eintraege nimmst, warum musst du dann FATAL und ERROR noch rausfiltern?)
Use ed once in a while!

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von bivvo » 29.12.2021 18:12:33

Juchhu, das hat schon geholfen! Und ja, danke, ich hab den Filter _nach_ der Selektion entfernt - war doppelt gemoppelt.
So geht's:

Code: Alles auswählen

tmp_info="$(echo "$INFO" 2>&1 | grep 'INFO' -c)"

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

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von Meillo » 29.12.2021 18:55:47

bivvo hat geschrieben: ↑ zum Beitrag ↑
29.12.2021 18:12:33
So geht's:
Weisst du auch wieso? ;-)
Use ed once in a while!

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von bivvo » 29.12.2021 19:42:14

woah, diese Fangfragen ^^ also mein laienhaftes Verständnis: echo gibt Text aus, in diesen muss erst ausgegeben und umgewandelt werden.
richtig?

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

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von Meillo » 29.12.2021 23:03:06

Keine Fangfrage, sondern die Frage, ob du den Unterschied verstanden hast oder nur dein konkretes Problem behoben hast, ohne zu wissen wieso. ... ist nur 'ne Gelegenheit was zu lernen. ;-)

Meine Frage ist also: Was ist der Unterschied zwischen den folgenden zwei Befehlen?

Code: Alles auswählen

echo "$INFO"

Code: Alles auswählen

echo $INFO
Use ed once in a while!

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von bivvo » 29.12.2021 23:21:27

Naja, bevor ich weiter rate: noch nicht. Ich denke ohne Hochkomma wird ein Befehl in der Variable ausgeführt, mit Hochkomma wird der Inhalt als String ausgegeben.

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

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von Meillo » 30.12.2021 17:41:04

bivvo hat geschrieben: ↑ zum Beitrag ↑
29.12.2021 23:21:27
Naja, bevor ich weiter rate: noch nicht. Ich denke ohne Hochkomma wird ein Befehl in der Variable ausgeführt, mit Hochkomma wird der Inhalt als String ausgegeben.
Raten ist ja nicht unbedingt der beste Weg zur Loesung. Der bequemste Weg ist wohl zu warten, bis es einem jemand erzaehlt. Der vermutlich anstrengenste Weg ist es, nachzulesen. Aber es gibt auch noch den Weg Annahmen zu treffen und diese durch Ausprobieren zu pruefen. Das koenntest du an dieser Stelle mal machen. ;-)

Deine erste Annahme ist: ``ohne Hochkomma wird ein Befehl in der Variable ausgeführt''. Na dann machen wir das doch einfach mal. Als Befehl nehmen wir so etwas einfaches wie `date':

Code: Alles auswählen

a="date"
echo $a
Und? Wird `date' ausgefuehrt? Stimmt deine Annahme? Falls nicht, wie lautet dann deine neue Annahme, ausgehend von dem Ergebnis des Versuchs?

Deine zweite Annahme ist: ``mit Hochkomma wird der Inhalt als String ausgegeben''. Auch das koennen wir mal versuchen:

Code: Alles auswählen

a="date"
echo '$a'
... bzw. was genau meintest du eigentlich mit ``Hochkommas''?

Fuer mich gibt es drei so Zeichen:
- Single-Quotes ('), das was man im Deutschen als Apostroph bezeichnet
- Double-Quotes ("), das was man im Deutschen als Gaensefuesschen oder doppelte Anfuehrungszeichen bezeichnet
- Backticks (`), das was man im Franzoesischen als Accent Grave bezeichnet


Hast du Lust darauf, dass wir das gemeinsam weiter erarbeiten? Du wuerdest dadurch ein gutes Verstaendnis der Sache erlangen.
Use ed once in a while!

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von bivvo » 03.01.2022 11:23:45

Einen Teil hab ich schon mal verstanden durch folgende Erklärung, die ich eher zufällig gefunden hab:
As noted in the comments, the difference is that (1) the double-quoted version of the variable (echo "$RESULT") preserves internal spacing of the value exactly as it is represented in the variable — newlines, tabs, multiple blanks and all — whereas (2) the unquoted version (echo $RESULT) replaces each sequence of one or more blanks, tabs and newlines with a single space. Thus (1) preserves the shape of the input variable, whereas (2) creates a potentially very long single line of output with 'words' separated by single spaces (where a 'word' is a sequence of non-whitespace characters; there needn't be any alphanumerics in any of the words).

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

Re: Scripting: echo $var | grep -c funktioniert nicht wie erwartet

Beitrag von Meillo » 04.01.2022 10:42:02

bivvo hat geschrieben: ↑ zum Beitrag ↑
03.01.2022 11:23:45
Einen Teil hab ich schon mal verstanden durch folgende Erklärung, die ich eher zufällig gefunden hab:
As noted in the comments, the difference is that (1) the double-quoted version of the variable (echo "$RESULT") preserves internal spacing of the value exactly as it is represented in the variable — newlines, tabs, multiple blanks and all — whereas (2) the unquoted version (echo $RESULT) replaces each sequence of one or more blanks, tabs and newlines with a single space. Thus (1) preserves the shape of the input variable, whereas (2) creates a potentially very long single line of output with 'words' separated by single spaces (where a 'word' is a sequence of non-whitespace characters; there needn't be any alphanumerics in any of the words).
Diese Erklaerung trifft dein urspruengliches Problem auf den Punkt.
Use ed once in a while!

Antworten