it-swarm.com.de

Linux Kopf/Schwanz mit Versatz

Gibt es eine Möglichkeit in Linux nach dem Kopf oder Schwanz zu fragen, aber mit einem zusätzlichen Versatz der Datensätze, die ignoriert werden sollen?.

Zum Beispiel, wenn die Datei example.lst Folgendes enthält:

row01
row02
row03
row04
row05

Und ich benutze head -n3 example.lst Ich kann die Zeilen 1 - 3 erhalten, aber was ist, wenn ich die erste Zeile überspringen und die Zeilen 2 - 4 erhalten möchte?

Ich frage, weil einige Befehle einen Header haben, der in den Suchergebnissen nicht erwünscht ist. Beispielsweise gibt du -h ~ --max-depth 1 | sort -rh die Verzeichnisgröße aller Ordner innerhalb des Basisverzeichnisses in absteigender Reihenfolge sortiert zurück, fügt jedoch das aktuelle Verzeichnis an den Anfang der Ergebnismenge (d. H. ~).

Die Head- und Tail-Man-Page scheinen keine Offset-Parameter zu haben, daher gibt es möglicherweise eine Art range-Befehl, in dem die erforderlichen Zeilen angegeben werden können: z. range 2-10 oder etwas?

18
hash-bang

Von man tail:

   -n, --lines=K
        output the last K lines, instead of the last 10; 
        or use -n +K to output lines starting with the Kth

Sie können daher ... | tail -n +2 | head -n 3 verwenden, um 3 Zeilen ab Zeile 2 zu erhalten.

Nicht-Kopf/Ende-Methoden umfassen sed -n "2,4p" und awk "NR >= 2 && NR <= 4".

37
that other guy

Um die Zeilen zwischen 2 und 4 (beide inklusive) zu erhalten, können Sie Folgendes verwenden:

head -n4 example.lst | tail -n+2

oder

head -n4 example.lst | tail -n3
4
Farahmand

Es dauerte eine Weile, bis diese Lösung endete, die scheinbar die einzige war, die alle Anwendungsfälle abdeckte (bisher):

command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=${MAX_LINES:-200} \
          '{
               if (NR <= offset) print;
               else {
                   a[NR] = $0;
                   delete a[NR-offset];
                   printf "." > "/dev/stderr"
                   }
           }
           END {
             print "" > "/dev/stderr";
             for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++)
             { print a[i]}
           }'

Feature-Liste:

  • live-Ausgabe für Kopf (offensichtlich ist das für Schwanz nicht möglich)
  • keine Verwendung externer Dateien
  • fortschrittsbalken für stderr, ein Punkt für jede Zeile nach MAX_LINES, sehr nützlich für lang laufende Aufgaben.
  • vermeidet mögliche falsche Protokollierungsreihenfolge durch Pufferung (stdbuf)
0
sorin