Wie kann ich einen bedingten Header VOR stdout drucken, wenn auf stdout eine Ausgabe erfolgt?

7

Ich habe einen Prozess, der eine Liste von Dateien aus einem Verzeichnis filtert (indem findüberprüft wird, ob Dateien älter als ein bestimmter Zeitraum sind, um anzuzeigen, dass eine Warteschlange hängen bleibt). Es kann etwas zurückgeben oder nicht, und wenn dies der Fall ist, wird es per Post an gesendet cron.

Was ich wissen möchte, ist, ob es ein Programm oder eine einfache bashMethode gibt, an die diese Ausgabe weitergeleitet werden kann, und ob eine Ausgabe durch sie geleitet wird, stellen Sie eine Kopfzeile voran (wie "Dies sind die Dateien, die in der Warteschlange stecken").

Silvein
quelle
Verwandte Themen (kein Duplikat, ich habe für das Schließen gestimmt und dann festgestellt, dass dies falsch war): So überprüfen Sie, ob die Pipe leer ist, wenn Sie etwas anderes tun möchten, wenn die Eingabe leer ist
Gilles 'SO - hör auf, böse zu sein'

Antworten:

7

sed Inline-Antwort:

find ./files -mtime +90|sed '1s/^/Files stuck in queue:\n/'
Jodie C.
quelle
Das funktioniert und habe ich letztendlich benutzt.
Silvein
1
@silvein: Es scheint, dass kurz Ihr Hauptkriterium ist, also hier ein paar Punkte: Camhs awk Antwort kann so angepasst werden, dass sie nur 8 Zeichen länger als sed (oben) ist: awk 'NR==1{print "header"}1'... aber noch kürzer als oben, um 5 Zeichen : sed "1i header"
Peter.O
@ Peter.O Wie bei allen Unix-y-Dingen gibt es mehrere Möglichkeiten, etwas zu tun. Aber die Wahrscheinlichkeit, dass ich mich daran erinnern kann, steigt, wenn es kürzer ist.
Silvein
5

Da die anderen Methoden tatsächlich keine bashMethode bereitstellen , wurde gefragt:

command | while IFS= read -r line; do
    (( i )) || { printf '%s\n' 'These are the files stuck in the queue:' ; (( i++ )) ; }
    printf '%s\n' "${line}"
done

Alle verwendeten Befehle sind intern in bash.

Wenn keine Ausgabezeilen vorhanden sind, wird nichts gedruckt. Wenn ja, wird die Kopfzeile gedruckt und dann die Ausgabe von command.

Chris Down
quelle
Dies hat funktioniert und hat den Vorteil, alles zu sein bash.
Silvein
4

Wenn ich finde, dass ich bei der Verarbeitung eines Eingabestreams den Status beibehalten möchte, finde ich, dass awk oft das beste Werkzeug ist.

In diesem Fall möchten Sie einen Stream verarbeiten. Wenn Sie Eingaben sehen, schreiben Sie einen Header aus und zeichnen Sie auf, dass Sie den Header geschrieben haben.

awk '!input_seen { print "header"; input_seen = 1 } 1'

Dies gibt einen Header aus, wenn die Variable input_seenfalse ist (standardmäßig, wenn sie nicht definiert ist) und setzt sie auf einen Wahrheitswert (1). Die 1am Ende ist eine weitere Regel , die eine kurze Hand Art zu sagen: die aktuelle Zeile gedruckt werden - auch die ersetzen könnte 1mit { print }.

camh
quelle
Das hat funktioniert und ich hätte es benutzt, aber es ist etwas länger als die sedVersion.
Silvein
0

Oder,

output=$(command)
[[ -n $output ]] && { echo "header"; echo "$output"; }
Glenn Jackman
quelle