CMD 中的 gawk 命令与 && 运算符不工作

gawk command in CMD with && operator not working

我正在从 Windows CMD 发出 gawk 命令,但它只是卡住了 there.Same 命令在 Cygwin 终端中运行得非常好。 我试图在第 30 行

之后的文件的第一列中找到第一次出现的结尾大括号“}”

命令是

gawk 'NR > 30 &&  /^}$/ { print NR; exit }' Filename.c > Output.txt

我注意到另一件事,当我发出命令形式的 CMD 时,除了坚持它会创建一个名为行号的文件(如果执行上述命令,则创建 30)

命令行

gawk 'NR > 30 && /^}$/ { print NR; exit }' Filename.c > Output.txt

未按预期由 Windows 命令解释器解释,原因有两个:

  1. 与 Unix 和 Linux shell 相比,Windows 命令行上的直单引号没有特殊含义。因此,两个直单引号内的字符串不会像 Unix/Linux.

  2. 上的 shell 那样被解释为单个参数字符串
  3. gawk的参数字符串包含几个在Windows命令过程中具有特殊含义的字符:

    • > ... 重定向运算符
      有关此运算符的详细信息,请参阅 Microsoft TechNet 文章 Using command redirection operators
    • && ...条件命令连接运算符
      有关此运算符的详细信息,请参阅 Single line with multiple commands using Windows batch file 上的答案。
    • ^ ... 用于转义运算符的字符,例如 >&,用于在命令执行时被解释为文字字符。

在打开命令提示符 window 和 运行 cmd /? 时,Windows 命令解释器的简短帮助会在几页上输出。最后一个帮助页面的最后一段列出了 directory/file 名称或其他字符串中的哪些字符需要用直双引号将 name/string 括起来。

所以 Windows 命令行的标准解决方案是使用

gawk.exe "NR > 30 && /^}$/ { print NR; exit }" Filename.c > Output.txt

但这也没有产生预期的结果。我认为,但不确定 gawk 是从 Unix/Linux 移植到 Windows 而没有调整直接单引号和双引号的解释。

出于这个原因,需要另一种解决方案,即使用直单引号并转义 gawk 参数字符串中的每个特殊字符,以便 Windows 命令解释器将其解释为文字字符。

gawk.exe 'NR ^> 30 ^&^& /^^}$/ { print NR; exit }' Filename.c > Output.txt

此命令行使 Unix/Linux 控制台应用程序 gawk 的参数字符串对于 Windows 来说是不寻常的,也可以在 Windows 命令进程中工作。

避免 Windows 引用地狱的标准建议是将 awk 脚本(在本例中为 NR > 30 && /^}$/ { print NR; exit })存储在文件中(例如命名为 script.awk)并以 awk -f script.awk Filename.c > Output.txt.