首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >win-7 cmd上的GNU awk不会将输出重定向到文件

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

Stack Overflow用户
提问于 2019-10-29 10:49:22
回答 2查看 248关注 0票数 3

如果相关,我已经从sourceforge中的GNU指向源代码直接下载了GNU awkV3.1.6。

我得到了一个网页的网址使用wget的窗口。在处理传入的文件之后,我将其缩减为一行,我必须从其中提取一个键值,这是一个相当长的字符串。最后一行类似如下所示:

代码语言:javascript
复制
<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中使用了这个结构

代码语言:javascript
复制
type processedFile | awk -F "\"" "{print $2}"

并且我得到了预期的输出

代码语言:javascript
复制
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

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

代码语言:javascript
复制
type processedFile | awk -F "\"" "{print $2}" > tempDummy

我收到这个错误消息:

代码语言:javascript
复制
awk: cmd. line:1: fatal: cannot open file `>' for reading (Invalid argument)

我认为\“字段分隔符给我带来了一些痛苦,并将最后一个”字符设置为非闭合字符串值,但我不确定如何正确处理此问题。顺便说一句,同样的结构在我的centos机器上运行得很好。

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

EN

回答 2

Stack Overflow用户

发布于 2019-11-01 23:37:12

是的,您在cmd解析器如何处理带引号的区域的开始/结束位置方面存在问题。cmd看到的是

代码语言:javascript
复制
awk -F "\"" "{print $2}" > tempDummy
       ^-^^-^          ^-------------
       1  2            3

也就是说,三个引用的区域。由于>落在带引号的区域内,因此它不会作为重定向运算符处理,它是管道右侧的命令的参数。

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

代码语言:javascript
复制
type processedFile | awk -F ^"\"" "{print $2}" > tempDummy
                               ^^ ^..........^

或者,您可以对命令重新排序,将重定向操作放在它不能干扰的位置

代码语言:javascript
复制
type processedFile | > tempDummy awk -F "\"" "{print $2}"

但是,尽管这种方法可以工作,但在其他情况下,使用这种方法可能会失败,因为awk代码({print $2})被放在未加引号的区域中。

有一种更简单、标准、可移植的方法,无需处理引号转义:最好使用awk字符串处理,只包含引号字符的转义序列,而不是将引号作为参数传递

代码语言:javascript
复制
type processedFile | awk -F "\x22" "{print $2}" > tempDummy
票数 2
EN

Stack Overflow用户

发布于 2019-10-31 15:51:34

你们已经很接近了。这里的问题是,您将awk重定向与cmd one混合在一起。

为了完整起见,我使用的是MSYS2 awk版本(在这个问题上,版本不是问题):

代码语言:javascript
复制
awk --version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)

Windows版本在这种情况下是无关紧要的-将在Win7和Win10上运行

您的命令:

代码语言:javascript
复制
type processedFile | awk -F "\"" "{print $2}" > tempDummy

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

1)修复重定向

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

代码语言:javascript
复制
type processedFile | awk -F "\"" "{ print $2 > "tempDummy"; }"

2)使用awk读取文件

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

代码语言:javascript
复制
awk -F "\"" "{ print $2 > "tempDummy"; }" processedFile

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58600842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档