Win-7 cmd上的GNU awk,不会将输出重定向到文件

时间:2019-10-29 02:49:21

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

如果相关,我可以直接从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盒上运行得很好。

非常感谢任何指针。我尝试读取我可以找到的所有自述文件,但是它们都没有触及输出重定向。

2 个答案:

答案 0 :(得分:2)

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

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

,即三个引用区域。由于>落在引用区域内,因此不会被视为 重定向运算符,它是管道右端的命令参数。

这可以通过仅转义(^cmd的常规转义字符)来解决,以确保cmd在解析该行后正确生成最终命令并确保重定向不是awk命令的一部分

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

答案 1 :(得分:0)

你很近。这里的问题是您将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

使用>,而您期望该重定向是cmd.exe,但是awk需要一个文件,因此会出现错误:awk: cmd. line:1: fatal: cannot open file ``>'

1)解决重定向

您可以通过直接在awk上进行重定向来修复

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

2)使用awk读取文件

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

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

请不要忘记:重要的是GNU utils区分大小写,但Windows上的默认文件系统设置不区分大小写。