[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Tee für die letzten N Zeilen



Ich möchte in einer Pipe die Ausgabe der vorhergehenden Stufe in eine 
Datei schreiben, wobei ich aber immer nur die jeweils letzten N Zeilen 
behalten will.

Den ersten Teil kann tee natürlich. Für den zweiten habe ich kein 
Werkzeug gefunden. Ich habe mir ein Skript gebastelt (s.u.), das die 
gewünschte Funktionalität durch rotierte Ausgabedateien angenähert 
erreicht. Allerdings ist es sprachbedingt(?) langsam, ein Rohr mit viel 
und schnellem Durchfluss würde dadurch möglicherweise gebremst.

Falls die Performance jemals ein Problem werden sollte könnte ich die 
Funktionalität dann in Perl/Python/Ruby/C implementieren. Aber 
vielleicht gibt es das ja schon.

Michael


#! /bin/bash -e

out=
lines=10000
keep=2

usage() {
  echo "$0 [ -l <lines> | --lines <lines> ] [ -k <chunks> | --keep 
<chunks> ] <output file>"
}

while (( $# > 1 )); do
  case "$1" in
    --lines|-l)
      lines="$2"
      shift 2
      ;;
    --keep|-k)
      keep="$2"
      shift 2
      ;;
    --help|-h)
      usage
      exit 0
      ;;
    *)
      usage
      exit 1
      ;;
  esac
done

out="$1"

if [[ -z $out ]] || [[ -z $lines ]] || [[ -z $keep ]]; then
  usage
  exit 1
fi

exec 4> "$out"

i=0
while read l; do
  (( i += 1 ))
  echo "$l" >&4
  echo "$l"
  if (( $i >= $n )); then
    savelog -q -c "$k" -l "$out"
    i=0
  fi
done

exec 4>&-

exit 0


-- 
Michael Schuerig
mailto:michael@schuerig.de
http://www.schuerig.de/michael/


Reply to: