PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : head/tail - skript mit mehreren Variablen aufrufen



red_eye
11-04-2008, 13:54
Hallo,

ich bin realtiv neu und habe mir auch schon einiges im google über mein Problem gelesen nur leider habe ich bis dato keine Antwort gefunden also dachte ich mir ich versuhe es mal im Partnerforum von Linuxforen.

Folgendes Problem:

Programm: http://pastebin.ca/980928

diese Programm versuche ich z.B. mit

ls -l |./scriptname 5

aufzurufen, jetzt ist es so das ich auch die 5te Zeile als Output bekomme nur wenn ich einen zweiten Parameter auslesen möchte, was das Skript ja macht wie z.b

ls -l |./scriptname 5,6 oder ls -l |./scriptname 5/6 oder ls -l |./scriptname 5 6 oder ls -l |./scriptname 5&6

bekomme ich jedes mal die selbe Antwort und zwar:

head: „4“ kann nicht zum Lesen geöffnet werden: Datei oder Verzeichnis nicht gefunden

ich bin leider ziemlich ratlos, und zwar verwende ich ein etwas älteres shellscripting buch, und möchte eben täglich ein Kapitel durcharbeiten nur muss ich das Skript auch kapieren da es wie alles andere im Leben aufbauend ist, ich würde mich sehr über Anregungen oder Lösungvorschläge freuen.

CherrO your

red_eyes

ContainerDriver
11-04-2008, 14:40
Hallo,

zuerst mal zu deinem Code:


echo="Die Zeile lautet"
[...]
echo="und hier die Zeilenstatistik"
, da ist das "=" zu viel, es müsste also heißen


echo "Die Zeile lautet"
[...]
echo "und hier die Zeilenstatistik"
. Mit dem "=" weist du der Variable echo den String, der in Anführungszeichen steht, zu.

Dann zu deinem eigentlichen Problem: ich erhalte auch eine andere Fehlermeldung, z.B.


florian@leuchtturm0:~/tmp$ ls -lh | ./pipe.sh 5,6
head: 5,6: ungültige Anzahl von Zeilen
0 0 0
. Die von dir zitierte Meldung kommt wohl beim Aufruf "ls -l |./scriptname 5 6". Hier versucht head die Datei "6" (= dritter Parameter, steht in $2) zu öffnen. Ruft man das Skript nur mit einem Parameter auf, dann liest head automatisch von stdin, weil beim Aufruf von head keine Datei angegeben wird (da $2 leer ist).

Gruß, Florian

red_eye
11-04-2008, 16:01
Hallo Florian, danke für die rasche Antwort, ich bin mittlerweile soweit gekommen das ich glaube man kann head nur mit dem Operator 10 agiert und mit tail man dann einfach diesen Output begrenzen kann z.b auf 4 Zeilen 2 oder 1.

Ich hab mich ein bisschen schlau gemacht und erfahren das eigentlich sed das Werkzeug für mein Vorhaben ist. Auf alle fälle vielen Dank nochmal, bin leider noch nicht solange bei Linux on Board das ich sehr viel Know-How darüber hätte.


lg
red_eye

sed -n -e '2p' -e '5p' < <filename> = das wars dann was ich gesucht habe also wenn ich einfach die head|tail|tee zeile durch diese ersetze und sie mit Parameter auf dem Stdin ersetze müsste es klappen.

jan61
15-04-2008, 21:57
Moin,

hm, hast Du Dir mal angeguckt, was das Script überhaupt macht?

tmpfile=/tmp/tmpout # die Variable $tmpfile enthaelt den Pfad zur einer Datei
echo "Die Zeile lautet" # Ausgabe von "Die Zeile lautet"
head -n $2 $1 | tail -1 | tee $tmpfile # schrittweise:
# zuerst wird ab Zeile $2 (also der 2. Kommandozeilenparameter)
# der Inhalt der im 1. Parameter angegebenen Datei ausgegeben
# dann wird davon die 1. Zeile abgeschnitten
# jetzt wird das Ergebnis auf stdout ausgegeben und
# parallel in die mit $tmpfile angegebene Datei geschrieben
echo "und hier die Zeilenstatistik" # Ausgabe von "und hier die Zeilenstatistik"
wc <$tmpfile # wir zaehlen Zeichen, Wörter und Zeilen aus $tmpfile
exit 0Dein Script erwartet also 2 Parameter: Zuerst den Namen der Datei, die Du auswerten willst, dann die Nummer der Zeile, die Du daraus auswerten willst. Das Script kannst Du nicht per stdin füllen, es ist darauf gar nicht vorbereitet.

Jan