awk - 从文件和 STDIN 获取输入?

awk - 从文件和 STDIN 获取输入?

是否可以从文件和终端获取输入?我想在ENDawk 脚本的部分询问用户一些问题。

该输入应该由用户输入,而不是从包含要处理的数据的文件中读取。

END {
  getline choice
  if(choice == "Y")
    print "OK"
}

但选择是从输入文件中读取的。

答案1

您可以从/dev/tty或 从读取/dev/stdin

getline choice < "/dev/tty"

/dev/tty相当普遍(即使是极少数,以及/dev/nullPOSIX/dev/console所要求的),/dev/stdin不太常见,但至少 GNU awk 会将其识别为 stdin,即使系统没有这样的设备/特殊文件。

在 Linux(和 Cygwin,但不是其他 Unix-likes)上,读取/dev/stdin与从 stdin (fd 0) 读取不同,而是意味着从与 fd 0 上打开的同一文件读取。如果该文件是常规文件例如,这将从文件的开头开始读取,而不是从 fd 0 当前指向文件的位置开始读取。

由于 GNU自行awk处理路径/dev/stdin(并将其视为从 stdin 读取),因此在 Linux 或 Cygwin 上,它的行为与其他不进行特殊处理的应用程序不同。如果您想要 Linux/Cygwin 行为gawk(这里可能不是您的情况),您可以使用///dev/stdin/dev/./stdinforgawk停止将其识别为/dev/stdin特殊情况,或者如果您打算依赖 Linux/Cygwin 特定行为,则可能更好,使用 Linux/Cygwin 特定/proc/self/fd/0路径(/dev/stdin实际上是这些系统上的符号链接)。

答案2

作为看得到-也有效:

getline < "-"

或者

getline variable < "-"

相关内容