如果相关,我可以直接从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盒上运行得很好。
非常感谢任何指针。我尝试读取我可以找到的所有自述文件,但是它们都没有触及输出重定向。
答案 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 ``>'
您可以通过直接在awk
上进行重定向来修复:
type processedFile | awk -F "\"" "{ print $2 > "tempDummy"; }"
这里type
命令是多余的,因为您可以直接使用awk
来读取文件:
awk -F "\"" "{ print $2 > "tempDummy"; }" processedFile
请不要忘记:重要的是GNU utils区分大小写,但Windows上的默认文件系统设置不区分大小写。