Bestimmer Wert aus einer Datei holen

Hinweis: In dem Thema Bestimmer Wert aus einer Datei holen gibt es 6 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • Ich habe eine Datei mit immer 3 Zeilen


    Name,plz,ort,Einw
    N1,20099,Hamburg,400
    N2,24000,Kiel,200


    ich benötige nur den Wert aus der 3. Zeile 3 Wert also in diesem Fall Kiel


    Mein Versuch:
    Tail -1 Datei # gibt mir die letzte Zeile im Shell aus, schon ganz gut,
    aber das Zuweisen im Script in einer Variable klappt schon nicht
    t= tail -1 Datei
    Jemand einen Typ?


    Wenn das klappt wie splitte ich die letze Zeile und packe kiel in einer Variable?

    Für den Inhalt des Beitrages 116101 haftet ausdrücklich der jeweilige Autor: neptun

  • Verwende bitte Code- Tags!
    Und poste das ganze Script.


    Um in einem Shellscript die Ausgabe eines Befehls in eine Variable zu schreiben, verwendet man die sogeannte Process- Substition.
    In der Bash ist das var=$( someCommand ) , oder die alte (und POSIXLYCORRECTe) Syntax: var=`someCommand`


    Es gibt noch viel mehr Möglichkeiten das zu erledigen.


    sed und awk sollte man auf jeden Fall lernen.


    Und wenn du exakt beschreiben würdest, wozu du das wirklich brauchst, kann man auch eine ideale Lösung bieten.

  • Super für deine vielen Beispielen,


    aber irgendwie fruchtet das alles nicht.



    Code
    awk -F, 'NR =~ 3 {print $3}' home/sabine/temp

    hier bekomme ich einen Syntax Error



    dafür geht es mit sed


    Code
    sed -rn '3{s/([^,]+,){2}([^,]+).*/\2/p}' /home/sabine/temp


    aber ich ziehe mir die temp Datei mit wget, dummerweise sind in einer Spalte
    die Umlaute kaputt, die ich eigentlich gar nicht brauche, das sed verschluckt sich aber daran.
    Süd für Süd


    Vielleicht kann man auch einfach die 1 Spalte mit den Umlauten in der Datei überschreiben so das die kaputten Umlaute weg sind.
    Das wären aber Zeilen


    Ich habe aber einen anderer Ansatz:


    Code
    t=$(tail -1 /home/sabine/temp)# letzte Zeile holen


    der String den ich brauche fängt mit http an, ist aber auch der einzige der so anfängt in der Zeile
    daher kann ich einfach nach http suchen:



    Code
    st=$(grep http temp | awk -F ',' '{print $7}')# hier sucht der aber in die ganzen Datei temp

    er müsste aber in der Variable $t suchen, einfach temp durch $t ersetzen geht nicht,


    vielleicht eine Idee?


    in PHP würde ich einfach schreiben $teil = explode (","$t);
    echo teil[4]
    10 Sec. arbeit, warum ist die Shell Programmierung eigentlich so umständlich?

    3 Mal editiert, zuletzt von neptun ()

    Für den Inhalt des Beitrages 116124 haftet ausdrücklich der jeweilige Autor: neptun

  • Eine Shell ist keine Programmiersprache.
    Es ist ein Kommandointerpreter, dessen erste Aufgabe es ist den Kernel zur Ausführung von Programmen und Scripten zu bewegen.
    Dass man auch in einer Scriptsprache für eine Shell programmieren kann, ist eine sekundäre Aufgabe, die Shells erfüllen können.
    Deshalb ist eine Shell eine Art Zwitterwesen.
    Und Shellprogrammierung fundamental anders, als jede andere Script- oder Programmiersprache.
    Das hat auch seinen Sinn, und ist nicht schwerer oder leichter, als andere, falls man es kann.
    Lernen sollte man es auf jeden Fall und bis zu einer gewissen Fertigkeit bringen.


    PHP kannst dir - zumindest bei mir - sparen. Ich halte PHP für ein vorsätzliches Sicherheitsloch und lese sowas prinzipiell nicht.


    Es macht auch keinen Sinn, wenn du in Prosa über die Dinge dichtest.
    Wir brauchen Fakten.


    • Wie lautet der wget- Befehl?
    • Poste die heruntergeladene Datei.
    • Poste dein Script


    Wenn du schreibst:
    grep http temp , dann greppt (==GlobalRegularExpressionPrinter) er halt nach dem regulären Ausdruck http in der Datei temp, weil genau das die Syntax von grep ist. Wie die allermeisten GNU- Tools, ist auch grep ein Filter. Das heißt es kann Dateien lesen und bearbeiten, oder, wenn keine Dateien angegeben werden, und liest ohne Dateiangabe die STDIN (STanDardeINgabe). Die kann vom Keyboard stammen oder aus einer Pipe (aka. Verkettung von Befehlen.
    Eine Pipe mit dem Syntyzeichen | verbindet zwei Befehle, und die Ausgabe des ersten Befehles wird zur Eingabe des zweiten Befehles.
    Ein echo $t | grep http ist das, was du möchtest.


    grep, awk, sed können alle drei ähnliches, sind aber doch grundverschieden. Selbstverständlich können alle drei dein Problemchen erledigen.


    Hilfe für (Shell-) externe Befehle erhältst du mit man irgendeinKommano, für (Shell-) interne mit help irgendeinKommano.
    Und damit das nicht gar so einfach bleibt, gibt es Befehle, die es sowohl extern, wie intern gibt. (man == MANual)
    Und die Bash (deine Shell; es gibt zahllose viele Shells) kennt noch "compound commands". Probiere mal help if. Völlig im Gegensatz zu Programmiersprachen, bei denen ein if then elseif else lediglich ein Syntaxkonstrukt ist, ist das in einer Shell ein Konstrukt, das aus mehreren Kommandos besteht.


    Auch das test Kommando gibt es extern und intern. Probiere mal help test, help "[" und help "[[" und man test


    Es wäre auch sehr hilfreich für dich, wenn du bei uns in Mumble aufschlagen würdest.
    Dann könnten wir in einer gemeinsamen Shellsitzung solche Basics live durchspielen.
    Such hier im Forum mal nach Mumble.

  • aber ich ziehe mir die temp Datei mit wget, dummerweise sind in einer Spalte
    die Umlaute kaputt, die ich eigentlich gar nicht brauche, das sed verschluckt sich aber daran.
    Süd für Süd

    Umlaute kaputt? Ist der Post ein fake (siehe auch Profil)? Wenn nicht man iconv.

    be tolerant - not ignorant
    Alle Hunde sind schwarz.
    Es gibt einen Hund der nicht weiß ist.

    Für den Inhalt des Beitrages 116150 haftet ausdrücklich der jeweilige Autor: Boreas

  • Googlet man mal nach "wget umlaute" findet man in der Tat viele Probleme, aber wget soll ist nie das Problem, oft die Apache Konfiguration.


    wie sich später raus gestellt hatte waren es auch nicht die Umlaute, sondern ein Leerzeichen.


    Genau das Zeichen hat mein Split Befehl auch gestört.



    Mit meinem Script funktioniert es wohl jetzt:



    STR=$(tail -1 /home/sabine/temp) # letzte Zeile holen
    STR=$(echo $STR | tr ' ' '-') #leerzeichen entfernen
    STR_ARRAY=(`echo $STR | sed -e 's/,/\n/g'`) splitten
    echo ${STR_ARRAY[6]} hier kann ich auf jede Spalte zugreifen



    Vielen Dank auch an den User Berichtigung

    Für den Inhalt des Beitrages 116164 haftet ausdrücklich der jeweilige Autor: neptun

  • Wow! 3 externe Prozessaufrufe und zwei Pipes statt einer sed Zeile.


    Wie es in deinem Profil halt so steht: Ein Win7 Profi


    Dass ein Leerzeichen stört und damit solche Probleme macht, ist ausgeschlossen.
    @Boreas hat da recht. wenn, dann ist das ein Zeichensatzproblem.


    sed stört sich nicht an Leerzeichen. Aber sie sind Zeichen und beeinflussen natürlich das, was sed tut.
    Das ist mit ein Grund, warum wir nicht deine Windowsprosa, sondern die geposteten Daten lesen wollen.
    Das ignorierst du einfach, machst es nichts und wir dürfen dann, wie im Windowssupport, raten, statt Lösungen geben.


    Linux hat keinerlei Probleme mit Daten von allen möglichen anderen Betriebssystemen.
    Es gibt, wie @Boreas schon schrieb, das Standardtool iconv, das so ziemliche jeden Zeichensatz und jede verhaute Codierung für Linux übersetzen kann. Wir dealen schon immer mit solchen - meist den RFCs zuwiderhandelnden- Systemen.
    Selbst wget kann schon beim Download die häufigsten Sünden ausmerzen. Lies mal man wget.
    Oder lerne gleich den großen Bruder curl mit man curl


    In deinem Script verwendest du jetzt 3 Subshells und zwei Pipes.
    Im Vergleich zu einer sed Zeile. Damit liegt deine Lösung im Bereich des absolut Umständlichsten und Langsamsten.
    Das kann dir bei der heutigen Maschinenleistung völlig egal sein. Aber es liest sich schon sehr bescheiden.
    Die ganze translate Orige liese sich bashintern mit der ParameterExpansion der bash lösen.
    Wesentlich schneller.


    Es genügt aber auch eine einzige Zeile sed oder grep
    Ob du willst, oder nicht, mindestens diese beiden gehören zum Standardwerkzeugkasten, den man halbwegs souverän bedienen lernen sollte.
    Und dazu gehört ein gewisses Wissen über RegExes.
    (Auch davon gibt es in den Linuces viel mehr, als man sich wünscht)
    Die PCRE sollte man mindestens können. (PerlCompatibleRegularExpression)


    Vielleicht sollest du hier doch mal nach Mumble googlen.