我有一个简单的 awk 脚本,test1.awk
:
{
x=temp;
print x;
}
当我从命令提示符运行它时:
awk -v temp=hello -f test1.awk
我得到的只是一个光标。我点击Enter,它输出“hello”并给出另一个光标,Enter再次点击,它再次输出“hello”,等等。只是进入一个无限循环,需要用户输入,并且永远不会返回命令提示符。
D:\>awk -v temp=hello -f test1.awk
hello
hello
hello
hello
^C
D:\>
我怎样才能让它写“你好”(不需要用户输入)然后停止?
答案1
Awk 从 stdin 读取。当您按照上述方式运行 awk 时,awk 脚本将处理 stdin。您没有将其传入任何要处理的文件。如果您有一个文件,例如 test.in,您可以按如下方式运行 awk 程序:
awk -v temp=hello -f test1.awk test.in
awk 脚本将处理 test.in 并退出。
希望这可以帮助。
答案2
为了避免无意义的输入文件,您可以将命令放在 END 子句中:
END { x=temp; print x; }
然后使用 /dev/null 调用 awk 脚本作为输入,按照 Lewis M 的建议:
awk -v temp=hello -f test1.awk </dev/null
或者等效地在一行中:
awk -v temp=hello 'END {x=temp; print x;}' </dev/null
答案3
您说您想运行一些 awk 语句一次,而无需用户输入,然后停止并返回到命令提示符。 在您的例子中,您谈论的是命令提示符(cmd.exe
在 Windows 中),而不是 shell(如 bash)。
-
awk -v temp=hello'END {x=temp; print x;}'</dev/null
可以在 Unix / Linux 中工作,甚至可以在 Windows 中的类 Unix shell 中工作,但不能在 中工作
cmd.exe
。Windows 没有/dev/null
,本身。 但是 Windows 确实有一个空设备,简称为NUL
。(您可以添加冒号,NUL:
如您所愿;这是可选的。并且,正如 Windows 中的典型情况一样,这是不区分大小写的,因此您可以说nul
。)因此awk -v temp=hello'END {x=temp; print x;}'< nul
可能会有效。你没有说
awk
你的 Windows 机器上有什么版本。我有 Cygwin,事实证明我可以做到C:\Users\scott> \cygwin64\bin\gawk -v temp=hello'END {x=temp; print x;}'/dev/null 你好
区别在于,当您说 时,命令处理器(在您的情况下)会处理文件名,但是,如果您省略< filename
cmd.exe
<
并说filename
,程序会处理它。事实证明,Cygwin 程序将其解释/dev/null
为空设备,即使它们是从命令提示符运行的。由于我不知道
awk
您的 Windows 机器上有什么版本,所以我不知道这是否适合您。 - Matthias 几乎给出了一个很好的答案。刘易斯·M 解释awk 处理输入。典型的 awk 程序如下所示
开始 {在程序开始时执行(一次)某件事} {每行输入都要执行一些操作} /foo/ {对包含“foo”的每一行输入执行某些操作} {每行都要做一些其他的事情} ︙ 结尾 {程序结束时要做(一次)的事情}
所有这些部分都是可选的。(并且,正如您在问题中所演示的那样,代码块(又称操作)可以分成多行。短代码可以放在同一行上。)Matthias 的想法是将您的语句放入代码END
块中, 然后提供一个空输入,这样 awk 将启动,执行一次语句,然后退出。 这并没有什么不对。™ 但事实证明,如果你的程序由一个BEGIN
代码块组成, 仅此而已,然后 awk 执行你的语句(一次) 甚至无需尝试读取任何输入。 所以你可以说awk -v temp=hello'BEGIN {x=temp; 打印 x;}'
并且不需要担心提供/指定任何输入。 下面是一个不太简单的 awk 程序示例:
awk'{打印“Hello”,$0}'
如果你输入这个然后点击Enter,它会说
Hello
。如果你输入world
,它会说Hello world
。如果你输入Kitty
,它会说Hello Kitty
©Ctrl。如您所知,您可以通过按+返回命令提示符C,这基本上意味着“中断/停止处理”。但“更好”的做法是按Ctrl+ D,这意味着“这是输入的结束”。这是 Unix 和 Linux 上的标准,但我可以执行以下操作(其中bold italic
text 是我输入的内容):C:\用户\斯科特>\cygwin64\bin\gawk'{print "你好", $0} END {print "再见"}' 水手 你好,水手 陌生人 你好,陌生人 Ctrl+D 再见
而如果我点击Ctrl+ C,END
代码就不会运行。再说一次,如果您使用 Cygwin 以外的其他软件,我不知道这是否适合您。
在上述示例中,我放在单引号 ( '…'
) 中的所有内容都可以放入文件中,然后您(如您所知)使用 调用该文件。在 Unix、Linux 和 Cygwin 上,我更喜欢将 awk 程序放入 shell 脚本中,例如-f filename
/bin/sh #!/bin/sh 复制代码 awk'{print“Hello”,$0}'“$@”而不是使用
.awk
文件。"$@"
允许您将参数传递给 awk。您可能能够在 Windows 批处理文件中使用 来执行此操作$*
,但在 Windows 中事情从来都不容易。