Linux shell (bash) read Befehl funktioniert nicht?

... komplette Frage anzeigen

5 Antworten

ich verstehe nicht was du hier mit read anfangen willst.
read ist kein Linux-Befehl, read ist ein eingebautes Kommando der bash.

Aa kann ich leider nicht sagen, ob das auf Pipes ( | ) reagiert.

Offensichtlich willst du  nur die Ausgabe von grep ... |awk ---- in einer Variablen speichern.

Das geht doch ganz einfach mit

variable=`grep suchwort datei| awk ..... `

(möglicherweise auch noch export davor, wenn sie in nachfolgenden Shells benutzt werden soll)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von GunnarPetite
01.11.2016, 13:15

Hab es auch schon mit den Backticks versucht, Resultat ist leider dasselbe. Noch eine Idee?

Und was soll es mir sagen, dass read kein Linux- sondern ein bash-Kommando ist? Macht es die Benutzung in meinem script weniger legitim?

1

Hallo nochmal

Im übrigen habe ich das Problem bisher nicht über Variable lösen können.

Wenn Dein:

grep suchwort datei | awk -F "," '{ print $7 } | read variable

nicht funktioniert, wie wäre es so?:

variable=$(grep suchwort datei | awk -F "," '{ print $7 })

Dann sollte es doch klappen.

Es läuft jetzt über Ausleitung der Strings in eine Datei

Kann man so machen. Ob das sinnvoll oder schneller oder besser ist hängt konkret davon ab was Du tun möchtest und wie Du es umsetzt.

  • Leg doch mal das Beispiel beiseite und zeig das richtige Konstrukt mit dem Du arbeitest.

Linuxhase

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von GunnarPetite
27.11.2016, 22:59

Das hatte ich leider auch schon vergeblich versucht. Habe zur Zeit keinen Zugriff auf das Script, aber das hatte weder mit  $() noch mit `..` geklappt. War ganz seltsam. Auf der Kommandozeile ging es, nur im Script nicht.

0

Ich blicke nicht ganz durch, was du genau machen willst, aber ich kann dir die Grundstruktur erläutern:

Befehl mit mehrzeiliger Ausgabe |
(
# für alle Zeilen der Ausgabe
while read Var1 Var2
do
    # läuft in sub-shell! verarbeite $Var1 $Var2
 # ---> Vorsicht mit einem weiteren read!
done
)

wichtig ist das pipe symbol nach dem Befehl! ... die Ausgabe wird in die geklammerten Anweisungen 'gesendet'

Am Ende sind die Variablen Var1 und Var2 nicht mehr definiert!

oder (Interpretation eines Verzeichnisses, hier im /proc/ - Baum), die Ausgabe landet auch hier im geklammerten Block:

(
   while read
   do
       # läuft in sub-shell!
   done
) < /proc/scsi/scsi  # implizite Schleife (loop)
Antwort bewerten Vielen Dank für Deine Bewertung

Hallo

grep suchwort datei | awk -F "," '{ print $7 } | read variable

Wie wäre es mit:

read var <<< $(grep suchwort datei | awk -F "," '{ print $7 })

oder Du erklärst mal was das Konstrukt machen soll, denn es gibt bestimmt noch elegantere Wege.

Wo liegt mein Fehler?

Die Variable hat den Namen variable, aber es wird nichts über die Pipe hineingeschrieben weil read ein Shell-Kommando (build in) ist und kein zusätzliches Programm.

Linuxhase

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von GunnarPetite
01.11.2016, 22:48

Ganz kann ich da nicht zustimmen: 

ls -l | grep * | while read variable; do echo variable ; done

schreibt auch über read in eine Variable. Und dass es an read nicht liegt, habe ich bereits bewiesen: Eine Zuweisung an eine Variable aus einem Befehl mittels Backticks hat ebenso wenig geholfen. 

Das Interessante ist, dass awk durchaus etwas ausgibt, aber sich der Output eben nicht in eine Variable speichern lässt. 

Was ich machen möchte, kann ich dir sagen, wenn du mit dem Sleuthkit vertraut bist. Letzendlich möchte ich aus einer Timeline die inodes auslesen, was über awk bereits funktioniert. 

Ein eleganterer Weg löst allerdings nicht das Problem, denn mich interessiert ganz speziell, WARUM dieses Problem auftritt. 

0

read liest Dateien byteweise oder von der Tastatur-Eingabe.

Wenn du die Ausgabe eines Befehls in eine Variable packen willst, geht das z.B. so:

HOSTNAME=`/bin/hostname`
echo $HOSTNAME


Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von GunnarPetite
01.11.2016, 13:13

Nicht ganz richtig. read liest nach Bedarf auch bis EOL

read variable 

liest deine Eingabe, bis du Enter drückst und speichert in der Variablen. Das Problem scheint ein anderes zu sein, denn deine Variante mit den Backticks hat auch nicht funktioniert.

awk gibt eine mehrzeilige Ausgabe aus , diese Zeilen bekomme ich aber nicht in eine Variable gespeichert. Was ich seltsam finde... 

0

Was möchtest Du wissen?