Вы говорите, что хотите выполнить несколько операторов awk один раз, не требуя ввода данных пользователем, а затем остановитесь и вернитесь в командную строку.
А в вашем случае вы говорите о командной строке (cmd.exe в Windows), а не об оболочке (например, bash).
Ответ Матиаса Глэра,
awk -v temp = привет 'END {x = temp; print x;} '</dev/null
будет работать в Unix / Linux и, возможно, даже в Unix-подобной оболочке в Windows, но не в cmd.exe .
Windows не имеет /dev/null , по сути.
Но в Windows есть нулевое устройство, которое называется просто NUL . (Вы можете добавить двоеточие, в результате чего NUL: если хотите; это необязательно.
И, как это обычно бывает в Windows, это без учета регистра, так что вы можете сказать nul .)
Так
awk -v temp = привет 'END {x = temp; print x;} '<nul
вероятно будет работать.
Вы не говорите, какой вкус awk вас на Windows-машине.
У меня есть Cygwin, и получается, что я могу сделать
C:\Users\scott> \cygwin64 \bin \gawk -v temp = привет 'END {x = temp; print x;} '/dev/null helloРазница в том, что когда вы говорите < filename , командный процессор (в вашем случае cmd.exe ) обрабатывает имя файла, но, если вы пропустите < и говорите просто filename , программа его обрабатывает.
И оказывается, что программы Cygwin интерпретируют /dev/null как нулевое устройство, даже если они запускаются из командной строки.
Поскольку я не знаю, какой вкус awk вас есть на вашем компьютере с Windows, я не знаю, сработает ли это для вас.
- Матиас подошел очень близко к тому, чтобы дать вам действительно хороший ответ.
Как объяснил Льюис М, awk обрабатывает ввод.
Типичная awk-программа выглядит примерно так
НАЧАЛО { что-то делать (один раз) в начале программы } { что-то делать в каждой строке ввода } / foo / { что-то делать в каждой строке ввода, содержащей "foo" }} { что-то еще делать в каждой строке строка } ︙ END { что-то сделать (один раз) в конце программы }
где все эти части являются необязательными.
(И, как вы продемонстрировали в своем вопросе, блоки кода (или действия) можно разбить на несколько строк.
И короткие вещи могут быть соединены в одну линию.)
Идея Матиаса состоит в том, чтобы поместить ваш оператор (ы) в блок кода END , а затем предоставить нулевой ввод, чтобы awk запустил, выполнил ваш оператор (ы) один раз, а затем завершил работу.
Не то чтобы с этим что-то не так.™ Но получается, что, если ваша программа состоит из BEGIN блок кода, и ничего больше, то AWK выполняет ваше заявление (ы) (один раз) , не пытаясь даже никакого ввода.
Так что можете сказатьawk -v temp = привет 'BEGIN {x = temp; печатать x;} '
и не нужно беспокоиться о предоставлении / указании каких-либо входных данных.
Вот пример тривиальной программы awk, которая не слишком тривиальна:
awk '{print "Hello", $ 0}'
Если вы наберете это и нажмете Enter , появится сообщение Hello .
Если вы напечатаете world , он скажет Hello world .
Если вы наберете Kitty , она скажет Hello Kitty © .
Как вы знаете, вы можете вернуться к командной строке, нажав Ctrl+C , что в основном означает «прерывание / остановка обработки».
Но "приятнее" сделать это, нажав Ctrl+D , что означает "это конец ввода".
Это стандартно для Unix и Linux, но я могу сделать следующее (где я набрал bold italic ):
C:\Users\scott> \cygwin64 \bin \gawk '{print "Hello", $ 0} END {print "До свидания"}' моряк Привет незнакомец моряк Привет незнакомец Ctrl+D До свидания
тогда как, если я нажму Ctrl+C , код END не запустится.
Опять же, если вы используете что-то другое, чем Cygwin, я не знаю, будет ли это работать для вас.
Во всех приведенных выше примерах все, что я помещаю между одинарными кавычками ('…'), может быть помещено в файл, который вы затем (как вы знаете) вызываете с -f filename .
В Unix, Linux и Cygwin я предпочитаю помещать свои awk-программы в сценарии оболочки, например
#!/bin/sh
awk '{print "Hello", $0}' "$@"вместо того, чтобы использовать
.awk файлы.
"$@" Позволяет передавать аргументы в awk.
Вы можете сделать это в пакетном файле Windows с помощью
$* , но в Windows все не так просто.