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