Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
hanskanns
- Beiträge: 177
- Registriert: 07.06.2008 10:57:55
Beitrag
von hanskanns » 14.02.2019 19:22:29
Hallo,
ich versuche mich gerade daran ein Bashskript unter Debian zu schreiben. Nun komme ich an folgender Stelle nicht weiter und hoffe daher, dass ihr mir helfen könnt:
Ist es möglich jede Zeile diese Ausgaben in Variable umzuleiten?
Danke für die Hilfe im Voraus.
-
DeletedUserReAsG
Beitrag
von DeletedUserReAsG » 14.02.2019 21:13:35
Eine Möglichkeit wäre z.B.: variable=$(grep -R -h --include="*.txt" 'foo\|bar'). Andere werden bestimmt folgen. Es gibt übrigens ’nen ganz guten Beginners-Guide für die Bash, zu finden auf tldp.org
-
hanskanns
- Beiträge: 177
- Registriert: 07.06.2008 10:57:55
Beitrag
von hanskanns » 14.02.2019 22:43:48
Danke niemand
mit
wwird aber das gesammte Output in $variable gespeichert. und ich möchte die einzelne grep ausgaben speichern
LG
-
TomL
Beitrag
von TomL » 14.02.2019 23:08:55
hanskanns hat geschrieben: 14.02.2019 22:43:48
wwird aber das gesammte Output in $variable gespeichert. und ich möchte die einzelne grep ausgaben speichern
Ja, das ist möglich... dazu muss man die "Zeilen" des Ausgabeergebnisses in ein Array speichern. Ein Array ist am einfachsten umschrieben als "Listen-Variable", also eine Variable, die eine Liste von einzelnen Einträgen enthalten kann. Hier zwei Beispiele mit dem Directory-Befehl
, der den Inhalt eines Verzeichnisses anzeigt... im Beispiel werden alle Verzeichniseinträge in ein Array gespeichert und über eine For-Schleife einzeln angezeigt:
Code: Alles auswählen
array=($(ls -lah)); for item in "${array[*]}"; do echo -e "$item\n"; done
array=($(ls -lah)); for n in ${!array[*]}; do echo -e "${array[n]}"; done
Mit
grep ist es dann nicht prinzipiell anders als mit
ls.
-
tobo
- Beiträge: 2336
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 15.02.2019 01:04:57
Vielleicht beschreibst du mal besser, was du in der Folge noch mit den Daten anstellen willst!? Auf so eine normale Variable kann man nämlich auch zeilenweise zugreifen und möglicherweise ist dieses Zwischenspeichern sogar grundsätzlich überflüssig, wenn man die Daten durch eine Pipe direkt weiterverarbeitet. Die günstigste Datenstruktur ist komplett abhängig vom Anwendungsfall, den keiner außer dir kennt.
-
rendegast
- Beiträge: 15041
- Registriert: 27.02.2006 16:50:33
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von rendegast » 15.02.2019 13:48:37
Ganz zu Fuß?
Code: Alles auswählen
TMPf=$(tempfile)
COUNT=0
grep .... | while read LINE; do
COUNT=$(($COUNT +1))
echo "VAR${COUNT}=\"$LINE\""
done > $TMPf
. $TMPf
rm $TMPf
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-
hanskanns
- Beiträge: 177
- Registriert: 07.06.2008 10:57:55
Beitrag
von hanskanns » 15.02.2019 18:15:55
Habe jetzt zum testen folgende datei erstellt
a.txt
und test.sh
Code: Alles auswählen
#!/bin/sh
grep "test" ~/a.txt| while read LINE; do
COUNT=$(($COUNT +1))
echo "VAR${COUNT}=\"$LINE\""
exit 0
a.txt
test
test
erhalte die meldung
Syntax Fehler: Unerwartetes Dateiende.
-
rendegast
- Beiträge: 15041
- Registriert: 27.02.2006 16:50:33
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von rendegast » 15.02.2019 20:49:54
Es fehlt Ausgangs-COUNT und 'done'.
Ein COUNT=0
würde in dem Beispiel (unformatierte Ausgabe) die Zeichenanzahl des Variablennamens schnell ändern
9 -> 10
99 -> 100
Also zur schöneren Ausgabe ein 'printf' oder 'seq -w' o.ä. einbauen oder mit einem ausreichenden Wert anfangen, also zBsp.
COUNT=1000
Und was ich auch nicht beachtet habe, in LINE enthaltene Double-Quote.
Und sonstige evtl. problematische Zeichen(kombinationen).
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")