PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash-Script & sed



16-12-2000, 00:40
hi,

ich habe ein problem mit sed innerhalb eines bash-scripts. es geht um folgendes:
in Result ist ein text mit mehreren zeilen, den moechte ich in die einzelnen zeilen zerlegen, wobei ich immer nur eine brauche und dann die naechste bearbeitet werden kann.
bisher habe ich mir folgendes gedacht:

while [ $Line -le $Zeilen ]
do
Row=$(echo "$Return" | sed -n ' $Line$p ' )
while [ $Item -le 9 ]
do
Part=$(echo "Row" | awk ' { print $(($DOLLAR+'$Item')) } ' )
done
done

dummerweise erwartet sed die kommandos in ' ', sodass $Line nicht ersetzt wird. gibt es auch eine andere loesung? bei awk funktioniert es aber :-(

und wie sieht es mit awk aus? ich moechte jeweils die ersten 9 items bekommen - wieder in einer schleife.
awk ' { print $(($DOLLAR+'$Item')) } '

wie kann ich das einfacher machen?
$Dollar ist $, $Item die Itemnummer

thx,

ChakZul

mightymike99
16-12-2000, 15:16
Hi,

zwar bin ich nicht ganz dahintergestiegen was du so vorhast, aber ich denke mal du willst die ersten neun Zeilen aussschneiden und eventuell diese noch weiter zerlegen. Hier mein Vorschlag:



#!/bin/bash
# for-schleife: Verarbeitung der Zeichenketten "1"-"9"
for LINE in 1 2 3 4 5 6 7 8 9
do
TEXT=$(head -$LINE textfile | tail -1) # erst mit >>head<< die in $LINE
# angegebene Anzahl Zeilen ab Datei-
# anfang ausschneiden und mit
# >>tail -1<< wiederum die letzte
# davon

set $TEXT # Die einzelnen Woerter in einer
# Zeile als Parameter $1-$9 an-
# sprechbar machen

eval echo \$$LINE # Eine Paramerabhaengige Verarbei-
# tung andeuten
done

16-12-2000, 16:32
hi,

danke fuer die schnelle antwort. ich werde deinen vorschlag mal ausprobieren.
ich habe immer eine variable anzahl von zeilen, das bekomme ich aber mit wc -l gebacken. die einzelnen elemente der zeile sollen dann weiterverarbeitet werden, wie du es ja "entschluesselt" hast.

dummerweise will ich die ausgabe eines programs weiterverarbeiten, die so eine art tabellenform hat. allerdings sind da keine definierten trennzeichen drin und die felder haben keine definierte breite o.ä.. ausserdem koennen auch leere felder vorkommen. etwa so:

Name Vorname Geburtsdatum Wohnort Telefon
Bayer Heinz Uli ........... Bonn 123456

(Punkte sollen leerzeichen entsprechen)
mit dem, was ich bisher zusammengebracht habe und du mir vorgeschlagen hast, ist das filtern der einzelnen eintraege wohl nicht moeglich, oder? ich denke so langsam auch, dass sich das nicht fuer eine automatisierung eignet.
na ja, wenn sich die ausgabe mal nicht an die haeufigste formatierung haelt, dann stehen nacher die eintraege einer zeile eben in der falschen kategorie, aber sie sind noch da.

thx,

ChakZul

[Dieser Beitrag wurde von ChakZul am 16. Dezember 2000 editiert.]

mightymike99
16-12-2000, 19:12
Hi,

Wenn du keine Feldtrenner hast, kannst du's nur noch mit festen Feldlaengen versuchen, und das ganze dann mit >>cut -c<< extrahieren.

MfG Tobias

21-12-2000, 00:09
hi,

ích bins nochmal...
hab folgendes gemacht:
<code><pre>
# alle zeilen durchgehen, jeweils eine in Row schreiben
while [ $RCount -le $Zeilen ]
do
Row=$( echo $Return | head -$RCount | tail -1)
set $Row
echo $Row
# einzelne teile aus Row herausholen
for Count in 1 2 3 4 5 6 7 8 9
do
Part=$(eval echo \$$Count)
echo $Part
done
done

</pre>
</code>

tja, nur gibt echo $Part immer nur die entsprechenden Teile der *ersten* Zeile aus.
echo $Row hat die richtigen Eintraege.

Wie kann ich mit set fuer jede neue Zeile die $Part wieder in $1 bis $9 ablegen?

thx,

ChakZul



[Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

[Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

[Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

[Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

thommy
21-12-2000, 08:59
Ich weiß zwar nicht genau, was Du mit den Werten anstellen willst, aber awk scheint mir die elegantere Lösung zu sein:

<pre>
echo $result | awk '{ for (i=1; i<= NF; i++) print "Zeile " NFR " " i ". Feld ist " $i}'
</pre>

Arbeitsweise:

Mit "echo $result" wird awk gespeist. Da awk zeilenweise arbeitet, ist eine Schleife über die Zeile hinfällig.

Awk läuft im Beispiel vom ersten Feld $1 bis zum letzten Feld $(NF) und gibt jedes Feld mit der Zeile, in der es steht, seiner Nummer und dem Inhalt aus.

Thomas

21-12-2000, 16:04
hi,

ok, vielleicht wirds klarer wenn ich sage, worum es mir geht. vielleicht hat auch jemand eine viel elegantere loesung als ich sie hier anfangs gepostet habe.

ich moechte immer mal wieder abfragen, wer auf meinem rechner gerade eingeloggt ist. dazu benutze ich finger. das problem daran ist, dass dessen ausgaben keine feldtrenner haben und manche zellen nicht besetzt sind.
kann man ja evtl. noch mit diversen abfragen umgehen, wenn ein doppelpunkt drin ist, dann ist es entweder device oder uhrzeit usw.

mir geht es jetzt darum, die einzelnen Items in eine tabelle zu schreiben. dazu muss ich die einzelnen zeilen in login, name, uhrzeit etc aufspalten.

thommy:
danke, das hilft mir. ich hatte schon mit awk experimentiert, dort aber nur die spalten mit x zeilen bekommen. da kannte ich die methode mit head & tail noch nicht und habs aufgegeben und hier gepostet.

da faellt mir ein, who scheint eine gute ausgabe zu haben. ich glaube, ich benutze who und hole dann mit finger den vollen namen und evtl die remote-adresse. ist glaube ich wesentlich einfacher.

ein eigenes finger etc zu schreiben oder das userfile direkt auszulesen ist nicht moeglich, da es evtl noch auf anderen rechnern eingesetzt werden soll, die keinen zugriff darauf haben.

danke fuer eure hilfe,

ChakZul

mightymike99
22-12-2000, 23:15
Dokumentationsfundstellen:

awk:
<A HREF="http://baracke.rus.uni-stuttgart.de/%7Erushobel/minikurs/awk/">http://baracke.rus.uni-stuttgart.de/%7Erushobel/minikurs/awk/</A>

Shell-Programmierung:
<A HREF="http://www.linuxinfo.de/de/doku/script1/konz-bed/Linux.html">http://www.linuxinfo.de/de/doku/script1/konz-bed/Linux.html</A>

SED:
<A HREF=http://www.linuxfibel.de/linux/linuxfibel/sed.htm>http://www.linuxfibel.de/linux/linuxfibel/sed.htm</A> SORRY war falsch geschrieben, geht selbstverständlich!!!

mfg Tobias



[Dieser Beitrag wurde von mightymike99 am 04. Januar 2001 editiert.]

thommy
02-01-2001, 09:22
Anmerkungen zum Link der Linuxfibel...

Alle Dateien enden auf *.htm (nicht *.html http://www.linuxforen.de/ubb/wink.gif), das Stammverzeichnis ist http://www.linuxfibel.de/linux/linuxfibel bzw. http://www.saxsys.de/linux/linuxfibel bzw. http://www.termer.de/linuxfibel

Grüße
Thomas