Sie sagen, Sie möchten einige awk-Anweisungen einmal ausführen, ohne dass eine Benutzereingabe erforderlich ist. Stoppen Sie dann und kehren Sie zur Eingabeaufforderung zurück. In Ihrem Fall sprechen Sie von der Eingabeaufforderung ( cmd.exe
in Windows) und nicht von einer Shell (wie bash).
Matthias Gralle Antwort ,
awk -v temp = hallo 'END '</ dev / null
funktioniert unter Unix / Linux und vielleicht sogar in einer Unix-ähnlichen Shell unter Windows, aber nicht in cmd.exe
. Windows muss nicht ein /dev/null
, per se. Windows hat jedoch ein Nullgerät, das einfach aufgerufen wird NUL
. (Sie können einen Doppelpunkt hinzufügen, was zu einem Ergebnis führt NUL:
, wenn Sie möchten; es ist optional. Und wie in Windows üblich, wird die Groß- und Kleinschreibung nicht beachtet, so dass Sie sagen können nul
.) Also
awk -v temp = hallo 'END '<nul
wird wahrscheinlich funktionieren. Sie sagen nicht, welchen Geschmack awk
Sie auf Ihrem Windows-Rechner haben. Ich habe Cygwin und es stellt sich heraus, dass ich das kann
C: \ Benutzer \ scott> \ cygwin64 \ bin \ gawk -v temp = hallo 'END '/ dev / null Hallo
Der Unterschied ist, dass, wenn Sie sagen, der Befehlsprozessor ( in Ihrem Fall) den Dateinamen verarbeitet, aber wenn Sie das weglassen und sagen, es wird vom Programm verarbeitet. Und es stellt sich heraus, dass Cygwin-Programme das Nullgerät interpretieren , selbst wenn sie von der Eingabeaufforderung aus ausgeführt werden.< filename
cmd.exe
<
filename
/dev/null
Da ich nicht weiß, welchen Geschmack awk
Sie auf Ihrem Windows-Rechner haben, weiß ich nicht, ob dies für Sie funktioniert.
- Matthias war sehr nahe daran, Ihnen eine wirklich gute Antwort zu geben. Wie Lewis M erklärte, verarbeitet awk die Eingabe. Ein typisches awk-Programm sieht ungefähr so aus
BEGIN { etwas zu tun (einmal) am Anfang des Programms } { etwas für jede Eingabezeile } / foo / { etwas zu tun in jeder Zeile der Eingabe, die "foo" enthält } { etwas anderes in jeder Zeile zu tun } ︙ END { etwas (einmal) am Ende des Programms }
wo all diese Teile optional sind. (Und wie Sie in Ihrer Frage gezeigt haben, können Codeblöcke (auch als "Aktionen" bezeichnet) in mehrere Zeilen aufgeteilt werden, und kurze Dinge können in derselben Zeile zusammengefasst werden.) Matthias 'Idee ist, Ihre Anweisungen in den END
Code einzufügen blockieren und dann eine Null-Eingabe bereitstellen, damit awk startet, Ihre Anweisungen einmal ausführt und dann beendet. Nicht, dass daran etwas nicht stimmt. ™ Es stellt sich jedoch heraus, dass awk Ihre Anweisungen (einmal) ausführt, wenn Ihr Programm aus einem BEGIN
Codeblock und nichts anderem besteht, ohne zu versuchen, Eingaben zu lesen. So kannst du sagenawk -v temp = hallo 'BEGIN '
und müssen sich keine Gedanken über die Eingabe / Angabe von Eingaben machen. Hier ist ein Beispiel für ein triviales awk-Programm, das nicht zu trivial ist:
awk ''
Wenn Sie dies eingeben und dann drücken Enter, wird es sagen Hello
. Wenn Sie tippen world
, wird es sagen Hello world
. Wenn Sie tippen Kitty
, wird Hello Kitty
© angezeigt . Wie Sie wissen, können Sie durch Drücken von Ctrl+ zu Ihrer Eingabeaufforderung zurückkehren C, was im Wesentlichen „Unterbrechen / Stoppen der Verarbeitung“ bedeutet. Eine "schönere" Sache ist jedoch das Drücken von Ctrl+ D, was bedeutet, "dies ist das Ende der Eingabe". Dies ist Standard bei Unix und Linux, aber ich kann Folgendes tun (wobei der bold italic
Text so ist, wie ich ihn eingegeben habe):
C: \ Benutzer \ scott> \ cygwin64 \ bin \ gawk ' END ' Seemann Hallo, Matrose Fremder Hallo Fremder Ctrl+ D Auf Wiedersehen
Wenn ich jedoch Ctrl+ drücke, läuft Cder END
Code nicht. Wenn Sie etwas anderes als Cygwin verwenden, weiß ich nicht, ob dies für Sie funktioniert.
In den obigen Beispielen kann alles, was ich in einfache Anführungszeichen ( '…'
) setze, in eine Datei eingefügt werden, die Sie dann (wie Sie wissen) mit aufrufen . Unter Unix, Linux und Cygwin ziehe ich es vor, meine awk-Programme in Shell-Skripte zu integrieren, wie-f filename
#! / bin / sh awk ' "" $ @ "
anstatt
.awk
Dateien zu verwenden. Damit
"$@"
können Sie Argumente an awk übergeben. Möglicherweise können Sie dies in einer Windows-Batchdatei mit machen
$*
, aber in Windows ist das nie einfach.