【发布时间】:2019-01-20 15:31:25
【问题描述】:
非常简单的问题(我认为)我很惊讶我似乎找不到答案。所以到目前为止我有以下内容:
£ perl -ne 'print if /ENGPacific Beach\s\s/' 15AM171H0N15000GAJK5 \
| perl -ane 'print "$F[1]|";END{print "\0"}' | xargs -i -0 echo {}
3346|10989|95459|139670|2239329|3195595|3210017|
所以....第一个管道是因为文件是 1.5G,所以最初不进行记录分离会大大加快速度。 xargs 部分是为了展示我正在尝试做的事情。基本上就是以下这些
| xargs -i perl --setperlvar pipeContents={} -ane 'print if $F[3] =~ /$pipeContents/' 15AM171H0N15000GAJK5
1) 我知道我可以在脚本中使用 ARGV。我知道整个事情应该只是一个脚本。让我们忽略这些位。我对-n 的爱是无限的。
2) 抱歉,我自己找不到这个。我确信这非常明显……我在 perldoc 中进行了一些挖掘,但什么也没找到。
3) 我对强制 {} 在 perl 刻度中间由 shell 解释的 bash/zsh 解决方案感兴趣。
【问题讨论】:
-
我不确定您的管道中涉及的所有内容,但请参阅 this post 中将参数从 bash 传递到 Perl 单行器的三种方法
-
提案(3)是主要安全漏洞的来源。在现实世界中实际利用的安全漏洞——搜索“shell injection”;将数据作为代码注入 perl 解释器与将其注入 shell 一样糟糕。不要这样做,尤其是当您处理 1.5GB 的数据并且无法手动读取它以查找任何
"+system("rm -rf ~")+"子字符串时。 -
(就此而言,
xargs没有-0或-d $'\n'在 bash 世界中也被认为是不好的做法,因为一些相当好的原因;请参阅 the "Actions in Bulk" section of Using Find)。 -
--setvar是一个东西,还是你编造的? -
感谢您的解释 -- 是的,我知道
xargs但我不确定它是否是您想要的内容的一部分,或者仅用于“演示...我>”。我也不确定目标到底是什么。但现在一切都很好,你已经得到了来自 ikegami 的非常彻底的分析 :)