如何从 awk 脚本返回到命令行?

如何从 awk 脚本返回到命令行?

我有一个简单的 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)。

  1. Matthias Gralle 的回答

    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
    你好
    区别在于,当您说 时,命令处理器(在您的情况下)会处理文件名,但是,如果您省略< filenamecmd.exe<并说filename,程序会处理它。事实证明,Cygwin 程序将其解释/dev/null 为空设备,即使它们是从命令提示符运行的。

    由于我不知道awk您的 Windows 机器上有什么版本,所以我不知道这是否适合您。

  2. Matthias 几乎给出了一个很好的答案。刘易斯·M 解释awk 处理输入。典型的 awk 程序如下所示
    开始 {在程序开始时执行(一次)某件事}
          {每行输入都要执行一些操作}
    /foo/ {对包含“foo”的每一行输入执行某些操作}
          {每行都要做一些其他的事情}
    结尾 {程序结束时要做(一次)的事情}
    所有这些部分都是可选的。(并且,正如您在问题中所演示的那样,代码块(又称操作)可以分成多行。短代码可以放在同一行上。)Matthias 的想法是将您的语句放入代码END块中, 然后提供一个空输入,这样 awk 将启动,执行一次语句,然后退出。  这并没有什么不对。  但事实证明,如果你的程序由一个BEGIN代码块组成, 仅此而已,然后 awk 执行你的语句(一次) 甚至无需尝试读取任何输入。  所以你可以说
    awk -v temp=hello'BEGIN {x=temp; 打印 x;}'
    并且不需要担心提供/指定任何输入。
  3. 下面是一个不太简单的 awk 程序示例:

    awk'{打印“Hello”,$0}'

    如果你输入这个然后点击Enter,它会说Hello。如果你输入world,它会说Hello world。如果你输入Kitty,它会说Hello Kitty©Ctrl。如您所知,您可以通过按+返回命令提示符C,这基本上意味着“中断/停止处理”。但“更好”的做法是按Ctrl+ D,这意味着“这是输入的结束”。这是 Unix 和 Linux 上的标准,但我可以执行以下操作(其中bold italictext 是我输入的内容):

    C:\用户\斯科特>\cygwin64\bin\gawk'{print "你好", $0} END {print "再见"}'
    水手
    你好,水手
    陌生人
    你好,陌生人
    Ctrl+D
    再见
    而如果我点击Ctrl+ CEND代码就不会运行。

    再说一次,如果您使用 Cygwin 以外的其他软件,我不知道这是否适合您。


在上述示例中,我放在单引号 ( '…') 中的所有内容都可以放入文件中,然后您(如您所知)使用 调用该文件。在 Unix、Linux 和 Cygwin 上,我更喜欢将 awk 程序放入 shell 脚本中,例如-f filename

/bin/sh #!/bin/sh 复制代码
awk'{print“Hello”,$0}'“$@”
而不是使用.awk文件。"$@"允许您将参数传递给 awk。您可能能够在 Windows 批处理文件中使用 来执行此操作$*,但在 Windows 中事情从来都不容易。

相关内容