Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Letzte Zeilen einer Datei

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.02.2005
    Beiträge
    40

    Letzte Zeilen einer Datei

    Guten Nabend,

    ich moechte einen Teil einer Datei ausgeben. Hier mal eine Beispieldatei:
    Code:
    A
    A
    B
    C
    A
    B
    C
    A
    Mit tail -n koennte ich jetzt die letzten n zeilen ausgeben, aber ich weiss leider nicht immer wie viele Zeilen ich brauche. Es gibt eine Zeile die sich immer wiederholt und immer gleiche ist. Hier ist es Zeile "A".
    Ich moechte jetzt ab dem zweiten A, von unten (dem Ende der Datei) gezaehlt bis zum Ende der Datei alles ausgeben.

    Kennt da wer einen Trick?

    Danke! && MfG bert2002

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    unschön, sollte aber funktionieren:
    Code:
    #!/bin/bash
    
    count=0
    line_count=0
    
    for line in `cat test.data`
    do
    	line_count=$(($line_count+1))
    	if [ $line == 'A' ]; then
    		count=$(($count+1))
    		a_lines[$count]=$line_count
    	fi
    done
    end=$count
    begin=$(($end-1))
    
    lines=$((${a_lines[$end]}-${a_lines[$begin]}+1))
    tail -n $lines test.data
    Grundlegende Idee:
    1) Alle Vorkommnisse von 'A' zählen + die Liniennummern merken. (for loop)
    2) Letztes & Vorletztes Vorkommnis (Array-Position) ermitteln
    3) Anzahl Linien für tail ausrechnen
    4) mit tail -n ausgeben

    Schwächen:
    * Die ganzen Daten werden zuerst durchsucht
    * Argument-Handling fehlt
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  3. #3
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Die Zeilen in umgekehrter Reihenfolge an grep geben und dann maximal bis zum 2. A suchen und alles darüber ausgeben lassen:
    Code:
    file="irgendwas"
    tac "$file" | grep -x -m 2 -B `cat "$file" | wc -l` A | tac
    Das gibt aber auch was aus, wenn nur eine Zeile A vorhanden ist.

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    das geht auch mit awk:
    Code:
    tac datei | awk 'BEGIN {cnt=0;} {print;} $0=="A" {cnt++; if (cnt==2) exit;}' | tac
    Jan

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.02.2005
    Beiträge
    40
    Vielen Dank fuer Eure Ideen. Scheinen auch alle soweit zu funktionieren wenn sich das besagte "A" am Anfang der Zeile befindet. Jedoch nicht wenn es in der Mitte der Zweile ist. Ich habe mir jetzt folgendes ausgedacht:

    Code:
    TMPLOG="/MY/TEMPFILE"
    LOGFILE="/MY/LOGFILE"
    
    LINE="WHATEVERYOUWANT"
    LASTLINE=$($CAT $LOGFILE | $GREP $LINE -n | $TAIL -n 1 | $AWK -F':' '{ print $1 }')
    FULLLINE=$($CAT $LOGFILE | $WC -l )
    LINENUMBER=$($ECHO `$ECHO $FULLLINE-$LASTLINE | $BC `+1 | $BC)
    
    $TAIL -n $LINENUMBER $LOGFILE > $TMPLOG
    Meine Variante ist nicht bei grossen Logdateien zu Empfehlen. Funktioniert aber auch wenn das "A" in der Mitte der Zeile ist.

    MfG bert2002

  6. #6
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von bert2002 Beitrag anzeigen
    Scheinen auch alle soweit zu funktionieren wenn sich das besagte "A" am Anfang der Zeile befindet. Jedoch nicht wenn es in der Mitte der Zweile ist.
    Deine Frage klang so, als sollte das A die gesamte Zeile darstellen. Du musst bei meinem Post oben nur das -x hinter dem grep entfernen.

  7. #7
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Zitat Zitat von bert2002 Beitrag anzeigen
    Vielen Dank fuer Eure Ideen. Scheinen auch alle soweit zu funktionieren wenn sich das besagte "A" am Anfang der Zeile befindet. Jedoch nicht wenn es in der Mitte der Zweile ist.
    Bei jans Lösung müsstest du nur den Part
    Code:
    $0=="A"
    zu
    Code:
    index($0, "A")>0
    ändern (ungetestet, eventuell musst da auch ein if hin), dann wird das A irgendwo in der Zeile gefunden.

    Gruß, Florian
    Ein gebrechlich Wesen ist der X-Server.

  8. #8
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von ContainerDriver Beitrag anzeigen
    Bei jans Lösung müsstest du nur den Part
    Code:
    $0=="A"
    zu
    Code:
    index($0, "A")>0
    ändern
    oder einfacher:
    Code:
    $0 ~ /A/
    Jan

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •