Moin,
Die Mailingliste der DaLUG läßt mich nicht rein, darum komme ich wieder hierher :-|. Gegeben ist ein Inputfile folgender Struktur:
<snip> cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.0 : INTEGER: 0 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.1 : INTEGER: 1 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.2 : INTEGER: 2 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.3 : INTEGER: 3 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.4 : INTEGER: 4 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.5 : INTEGER: 5 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.6 : INTEGER: 6 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.7 : INTEGER: 7 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.8 : INTEGER: 8 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.9 : INTEGER: 9 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.10 : INTEGER: 10 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.11 : INTEGER: 11 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.12 : INTEGER: 12 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.13 : INTEGER: 13 cw.tx3.tx3Im3.tx3Im3SDMgr.tx3Im3SDDstSlTb.tx3Im3SDDstSlE.tx3Im3SDDstSlI.14 : INTEGER: 14 <snap>
Das soll mittels bash so geparsed werden, daß die letzte Zahl vor dem : zurückgegeben wird. Die Zahl der Elemente, die vorne stehen und durch Punkte getrennt sind, ist variabel. Mein erster Gedanke war, alles hinter dem : abzuschneiden, die Restzeile umzudrehen, alles bis zu ersten Punkt abzuschneiden, das Ergebnis wieder zurückzudrehen und auszugeben. Leider habe ich keine effektive Methode gefunden, eine Zeile in Shell umzudrehen. cut verwendet als Trenner leider auch nur Strings aus einem Zeichen. Mein Shellhack sieht also so aus:
<snip> #!/usr/bin/bash #set -x i=0 temp=tempfile tmp=tmpfile out=output # soviele Felder sollen stehenbleiben felder=1 # Der Doppelpunkt dp=: # Das Trennzeichen trenner=.
# Das Inputfile erzeugen grep tx3Im3SDDstSlI $1 > /tmp/input
# alles vor dem ersten $dp wegwerfen cut -d$dp -f-1 /tmp/input > /tmp/tmp.first
# Ergebnis nach $PWD kopieren cp /tmp/tmp.first $temp
# wir z"ahlen hoch und cutten vom i-ten Punkt zum Ende weg und ab in # $temp. Abbruchbedingung: grep $trenner $temp liefert einen Leerstring. # while [ -n "`grep $trenner $temp`" ] do ((i=i+1)) cut -d. -f$i- /tmp/tmp.first > $temp # echo $i grep $trenner $temp > $i done
# Ergebnisfile umbenennen mv $((i-$felder)) $tmp
# Leerzeichen abstrippen sed 's/ //g' < $tmp > $out
# aufr"aumen for n in [1-9]*; do rm -f $n; done rm -f $temp $tmp /tmp/{tmp.first,input} <snap>
Das ganze sieht sehr unschön aus und ist extrem langsam. Ich weiß, daß das mit Perl besser geht, aber das steht hier nicht zur Debatte. Anforderung ist eine Lösung in bash/tcsh.
2. Problem: In tcsh habe ich einen tftp-dialog realisiert.
tftp << EOT connect 172.16.203.18 bin put $file1 irgendwohin quit EOT
Das ganze funktioniert auch ganz gut, aber jetzt will jemand den Exitstatus von dem Konstrukt abfragen können. Er kann (lt. eigenen Angaben) das "|| command"-Konstrukt hinsetzen, wo er will (vor das <<, hinter das << EOT) es kommt nicht das raus, was er will. Wie muß das ganze aussehen, wenn ich neben dem tftp-Kommando auch dessen Exitstatus haben will?
TIA, Hilmar