【问题标题】:GNU awk on win-7 cmd, won't redirect output to filewin-7 cmd 上的 GNU awk,不会将输出重定向到文件
【发布时间】:2020-02-24 07:18:22
【问题描述】:

如果相关,我有直接从 sourceforge 中的 GNU 指向源下载的 GNU awk V 3.1.6。

我正在使用 wget for windows 获取 URL 页面。在处理传入的文件后,我将其缩减为单行,我必须从中提取一个键值,这是一个相当长的字符串。最后一行看起来像这样:

<ENUM_TAG>content"href:e@5nUtw3Fc^b=tZjqpszvja$sb=Lp4YGH=+J_XuupctY9zE9=&KNWbphdFnM3=x4*A@a=W4YXZKV3TMSseQx66AHz9MBwdxY@B#&57t3%s6ZyQz3!aktRNzcWeUm*8^$B6L&rs5X%H3C3UT&BhnhXgAXnKZ7f2Luy*jYjRLLwn$P29WzuVzKVnd3nVc2AKRFRPb79gQ$w$Nea6cA!A5dGRQ6q+L7QxzCM%XcVaap-ezduw?W@YSz!^7SwwkKc"</ENUM_TAG>

我需要两个 " 符号之间的长字符串。

所以我将这个结构与 awk 一起使用

type processedFile | awk -F "\"" "{print $2}"

我得到了预期的输出

href:e@5nUtw3Fc^b=tZjqpszvja$sb=Lp4YGH=+J_XuupctY9zE9=&KNWbphdFnM3=x4*A@a=W4YXZKV3TMSseQx66AHz9MBwdxY@B#&57t3%s6ZyQz3!aktRNzcWeUm*8^$B6L&rs5X%H3C3UT&BhnhXgAXnKZ7f2Luy*jYjRLLwn$P29WzuVzKVnd3nVc2AKRFRPb79gQ$w$Nea6cA!A5dGRQ6q+L7QxzCM%XcVaap-ezduw?W@YSz!^7SwwkKc

但是当我运行相同的命令并将输出重定向到文件时,例如

type processedFile | awk -F "\"" "{print $2}" > tempDummy

我收到此错误消息:

awk: cmd. line:1: fatal: cannot open file `>' for reading (Invalid argument)

我认为 \" 字段分隔符让我感到有些悲伤,并将最后一个 " 字符作为非封闭字符串值,但我不确定如何正确处理。顺便说一句,同样的构造在我的 centos 盒子上运行得非常好。

非常感谢任何指针。我尝试阅读我能找到的所有自述文件,但没有一个涉及输出重定向。

【问题讨论】:

    标签: awk cmd windows-7 output io-redirection


    【解决方案1】:

    是的,cmd 解析器如何处理引用区域的开始/结束位置有问题。 cmd 看到的是

    awk -F "\"" "{print $2}" > tempDummy
           ^-^^-^          ^-------------
           1  2            3
    

    即三个引用区域。由于&gt; 位于引用区域内,因此不会将其作为 重定向运算符,它是管道右端命令的参数。

    这可以通过转义(^cmd 的一般转义字符)一个引号来解决,以确保cmd 在解析行后正确生成最终命令并且重定向不是@ 的一部分987654328@命令

    type processedFile | awk -F ^"\"" "{print $2}" > tempDummy
                                   ^^ ^..........^
    

    或者您可以重新排序命令以将重定向操作放置在它不会干扰的地方

    type processedFile | > tempDummy awk -F "\"" "{print $2}"
    

    但是,虽然使用这种方法有效,但后来在其他情况下可能会失败,因为 awk 代码 ({print $2}) 被放置在未引用的区域中。

    有一种更简单、标准、可移植的方法,无需处理引号转义:与其将引号作为参数传递,不如使用awk 字符串处理并仅包含引号的转义序列人物

    type processedFile | awk -F "\x22" "{print $2}" > tempDummy
    

    【讨论】:

      【解决方案2】:

      你很亲密。这里的问题是您将awk 重定向与cmd 混合在一起。

      为了完整起见,我使用的是MSYS2 awk 版本(版本在本期中不重要):

      awk --version
      GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
      

      在这种情况下,Windows 版本无关紧要 - 在 Win7 和 Win10 上都可以使用

      你的命令:

      type processedFile | awk -F "\"" "{print $2}" > tempDummy
      

      使用 &gt;,您希望它是 cmd.exe 重定向,但 awk 需要一个文件,因此您收到错误:awk: cmd. line:1: fatal: cannot open file ``&gt;'

      1) 修复重定向

      您可以修复直接在awk进行重定向:

      type processedFile | awk -F "\"" "{ print $2 > "tempDummy"; }"
      

      2) 使用awk读取文件

      type 命令在这里是多余的,您可以直接使用awk 来读取文件:

      awk -F "\"" "{ print $2 > "tempDummy"; }" processedFile
      

      别忘了注意:需要注意的是,GNU utils 区分大小写,但 Windows 的默认文件系统设置不区分大小写。

      【讨论】:

      • 感谢您的回答。他们按照我想要的方式工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 2016-09-09
      • 2021-09-09
      • 2021-07-21
      相关资源
      最近更新 更多