
Ich versuche, diesen Befehl so zu codieren, dass er zusammen mit zwei anderen auf dem Bildschirm ausgeführt wird, die cat
eine Datei lesen und sie dann zum Filtern weiterleiten awk
. Hier ist der Befehl:
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt | awk '{print $1}' > /var/www/html/filter/first.txt
Wenn ich den abgetrennten Bildschirm überprüfe, sehe ich, dass er die Liste filtert. Wenn er abgeschlossen ist, wird die Datei first.txt
erstellt, ist aber leer. Ich habe etwas über die Verwendung von „ -L
Bildschirm“ für ein Ausgabeprotokoll gelesen, aber ich möchte, dass die Ausgabe in denselben Ordner geht, in dem sich die ungefilterte Liste befindet und aufgerufen wird. first.txt
Ich kann nicht herausfinden, warum es erfolgreich ausgeführt wird, aber die Ausgabedatei jedes Mal leer ist. Wenn ich es ohne ausführe, screen -d -m
ist die erstellte Datei nicht leer. Ich glaube, ich übersehe etwas mit dem Bildschirmbefehl. Ich habe gerade angefangen, „Bildschirm“ zu verwenden. Ich bin mir nicht sicher, wann ich sonst posten soll.
Antwort1
Der Grund, warum das nicht funktioniert, liegt darin, dass die Shell den Befehl wie folgt in zwei Teile aufteilt:
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt
awk '{print $1}' >/var/www/html/filter/first.txt
Das screen
läuft cat
auf einem separaten PTY. Es gibt dann keine Ausgabe aufstdoutumleiten an awk
.
Wenn Sie möchten, dass die Pipe unter „screen“ ausgeführt wird, müssen Sie sie mit einer anderen Instanz einer Shell gruppieren:
screen -d -m bash -c 'cat /var/www/html/filter/unfiltered.txt | awk "{print $1}" >/var/www/html/filter/first.txt'
Anschließend sollte klar sein, dass dies eine unnötige Verwendung von ist cat
und der Befehl eigentlich wie folgt vereinfacht werden kann:
screen -d -m bash -c 'awk "{print $1}" </var/www/html/filter/unfiltered.txt >/var/www/html/filter/first.txt'
Beachten Sie, dass ich die Anführungszeichen darin von einfachen in doppelte geändert habe. Dies liegt daran, dass ich einfache Anführungszeichen verwendet habe, um den gesamten Befehl (und insbesondere $1
vor einer frühen Auswertung) zu schützen.