Bash-Skript: 2 Befehlsketten in eine Datei schreiben

MrDeluxe

Enthusiast
Thread Starter
Mitglied seit
01.04.2006
Beiträge
1.443
Hallo Community,

ich versuche schon eine ganze Weile zwei Befehlsketten in eine Datei zu schreiben. Dabei soll Befehl1 + Befehl2 in die selbe Zeile der Datei geschrieben werden.
Befehl1 fragt X-Cisco Kisten nach bestimmten Werten ab, Befehl2 ebenso nur mit anderen Werten. Ziel ist eine Datei mit der Verbindung beider Befehle, welche ihr Ergebnis in eine Zeile schreiben.

Meine Misglückten Versuche:

Befehl1 >> Datei & Befehl2 >> Datei


Das funktioniert so nicht, da ein Befehl schneller ausgeführt wird als der andere. Künstliche Verlangsamung á la sleep X ist sinnlos, da die Befehle unterschiedliche Laufzeiten haben.

Ein anderer Versuch war das Tool "paste" zu nutzen.
Beispiel:

Befehl1 > Datei1
Befehl2 > Datei2

paste Datei1 Datei2 >> Datei3


das funktionierte soweit auch ganz gut ABER die Zeilen stimmten bald nicht mehr überein, sprich statt:
a b
c d
e f

wurde:
a b
c f
e g

etc...



Ich bräuchte also in etwa sowas:
Befehl1 wird ausgeführt und schreibt das Ergebnis in die 1. Zeile, dann kleiner Break für Befehl1 bis Befehl2 abgeschlossen ist, welcher wiederrum seinen Textsatz in die 1. Zeile mit anfügt.
Dann ist Befehl1 wieder an der Reihe und schreibt in die 2. Zeile etc.


Ich wäre überaus dankbar für eine gescheite Lösung!


Mit freundlichen Grüßen
MrDeluxe
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Prinzipiell so, aber wenn da race conditions sind, klappt das so nicht:
Code:
echo -e "$(befehl1)\t$(befehl2)" >> $logfile

Folgendes klappt nur anständig, wenn beide Befehle gleich viele Zeilen ausspucken:
Code:
#!/bin/bash

befehl1 > /tmp/befehl1
befehl2 >/tmp/befehl2

LINES=$(wc -l /tmp/befehl1 |awk '{print $1}')
for ((i=1;i<=${LINES};i++)); do
    PART1=sed -n ${i}p /tmp/befehl1
    PART2=sed -n ${i}p /tmp/befehl2
   echo -e "${PART1}\t${PART2} > logfile
done
 
Zuletzt bearbeitet:
Hallo foxxx,

erstmal danke für die Antwort. Die 2. Variante kann ich leider nicht wählen, da ich auf komplexere Funktionen aus der .bash_profile zugreifen möchte. Ich möchte das nicht nochmal im skript umschreiben müssen, wenn möglich. Im Skript erkennt er ja leider nicht die Befehle/Funktionen der .bash_profile. Falls doch, lass es mich wissen :)

Ich werde das morgen mal austesten und mich dazu melden.
 
Zuletzt bearbeitet:
Falls du mit deinem Ansatz nicht weiterkommst, schau dir das mal an -> Shrubbery Networks, Inc. - RANCID
Mit Rancid kannst du die komplette Config in ein SVN oder CVS Repository einloggen. Ist aber vermutlich nicht ganz das was du suchst.
 
Zuletzt bearbeitet:
meine Bash Kenntnisse sind jetzt auch nicht so überragend, aber sollte
Code:
Befehl1 >> Datei; Befehl2 >> Datei; echo -e \n >> Datei
nicht das machen was du möchtest?
Vorausgesetzt natürlich dass der Output von Befehl1 + 2 nicht selbst Zeilenumbrüche enthält ...
 
Zuletzt bearbeitet:
Bin nicht selber drauf gekommen aber hier ist es, was ich wollte:

Code:
function Hubsdischwups { printf "%s\t" $1; Befehl1 $1 Parameter | egrep "BLAAA" | awk '{printf ("%s\t", $NF)}'; Befehl2 $1 Parameter2 | awk '{printf ("%s\t", $NF)}' ; Befehl1 $1 Parameter3 | awk '{print $NF}';}

Befehl2 Parameter4 Befehl1| egrep -v "[-][0-9]..bliblub" > Verzeichnis1/Datei_`date +%Y_%m`
 
Prinzipiell so, aber wenn da race conditions sind, klappt das so nicht:
Code:
echo -e "$(befehl1)\t$(befehl2)" >> $logfile

Was für race conditions? Dieser Code führt nacheinander befehl1 und befehl2 aus und gibt die Ausgabe immer richtig aus. befehl1 und befehl2 laufen halt nicht parallel. Wenn ich die Anforderung richtig verstanden habe, war das auch nicht Bedingung.
 
Zuletzt bearbeitet:
Hallo foxxx,

erstmal danke für die Antwort. Die 2. Variante kann ich leider nicht wählen, da ich auf komplexere Funktionen aus der .bash_profile zugreifen möchte. Ich möchte das nicht nochmal im skript umschreiben müssen, wenn möglich. Im Skript erkennt er ja leider nicht die Befehle/Funktionen der .bash_profile. Falls doch, lass es mich wissen :)

Ich werde das morgen mal austesten und mich dazu melden.

Du hättest meinen Kram auch für Parameter umbauen und in eine bash-Funktion wrappen können. Und jede bash-Funktion kannst du auch in die ~/.bashrc oder ~/.bash_profile schreiben. Für solche Sachen empfiehlt sich meiner Meinung aber eher etwas wie:
Skripe nach ~/bin/ packen und einfach ~/bin/ ganz vorne in PATH packen.

Aber wenn du deine Lösung jetzt hast, ist das ja auch ok.
 

Ähnliche Themen

Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh