可能这个问题多次被问到能否在你的perl脚本中加入awk one liner。但是这些问题对于以下问题过于具体:
示例:我的输出为ls -lart
,第9列为文件名。我可以在awk中轻松地做到ls -lart|awk '{print $9}'
。同样的事情当然可以使用perl使用readdir()
来完成。但是在perl中提取第8列或第7列并不容易?如果我必须将数据管道提取到awk将其传输到sed等,事情会变得更糟。
另一个例子: 我有一个特定的DIR,它有许多格式的文件,如:
ABC_9090_DEF_10-22-30_13-07-2014.temp
注意date_time.temp标记部分。此格式为 ABC_4digits_DEF_hours-minutes-seconds_day-month-year
我想只看到刚刚创建的新文件(比如说从现在起5分钟之前)。使用awk / sed的方法是(伪代码,让我知道你是否需要我复制实际的一个班轮):
ls -lart|awk '{print $9}'|
egrep
提取10-22-30_13-07-2014 问题: 但由于某种原因(其他复杂性)我想用perl写它,我发现if条件 if($ 1> $ mynum)在我使用系统命令在perl中使用它时会抛出错误。它说使用'>'的语法错误即使使用单引号,双引号,也没有引号。
有人可以告诉我一般情况:
答案 0 :(得分:6)
如果有选择,为什么有人不会在这种情况下使用awk,sed而不是perl?
如果您喜欢这个想法:
随时可以。这对我来说听起来很糟糕,但你知道:你的里程......
在perl中包含awk或sed时应该记住的事情不是特定于这个问题的通用解释(希望也应该解决这个特定的问题:))
要记住的通用事项:
$variables
的规则 - 如$9
可解释的内容:
$9
可以是存储正则表达式捕获的perl变量)$9
可以是保持第9个位置arg的shell
变量)awk
(这意味着第9列)举个例子:ls -lart|awk '{print $9}
是你能做的最糟糕的事情之一。
想象:
this is my file.txt
ls -lart|awk '{print $9}
?猜对了,只打印this
。当然,这是错误的。解析文件名是什么
来自stdin
总是很糟糕(除非你有NULL终止的文件名),因为文件名可以包含空格 - 不仅是spaces
,还有tab
或newline
个字符。
到第二个例子:
find
来实现所需:print only new files modified in the last 5 min
find
命令所做的任何事情以及更多File::Find
家庭Class::Path
或类似的模块