【发布时间】:2014-09-03 09:07:35
【问题描述】:
这个问题可能已经被问过很多次了,关于能否在你的 perl 脚本中包含 awk one liner。但这些问题对以下问题过于具体:
- 提供了一种不同的方法作为建议或
- 现有代码中的语法已更正或
- 大多数时候 -> 解决方案是使用 perl 提供的,因为专家倾向于使用 awk 或 perl,因为它们都做同样的工作。是的。可能。但我认为 awk 是为解决特定问题而设计的,这些问题可以在 awk 中比 perl 更好地解决。
示例:我有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 - 使用 sed 将 _ 替换为 -|awk 以重新排列 以使数字采用 YEARMONTHDAYHOURSMINUTESSECONDS 格式。
- 再次使用 awk 使用 if($1>$mynum) 将此数字与变量进行比较(该变量应该有一个相同格式的数字,代表 TODAYS TIME - 5 分钟)
问题: 但由于某种原因(其他复杂性),我想用 perl 编写它,我发现 if 条件 if ($1>$mynum) 在我使用系统命令在 perl 中使用它时会引发错误。即使使用单引号、双引号、无引号,它也会显示使用 '>' 的语法错误。
谁能概括地告诉我:
- 如果可以选择,为什么有人在这种情况下不使用 awk,sed 而不是 perl?
- 在 perl 中包含 awk 或 sed 时应记住的事项的一般解释并非针对此问题(希望也能解决此特定问题。
【问题讨论】:
-
请不要解析ls。
-
这个问题缺乏焦点。无论如何,仅仅因为某事可以被完成并不意味着它是一个好方法。 awk/sed 通常最好直接与 shell 配对,即使 perl 可以 相当容易地调用它们(这并不意味着它是一个好方法)。
-
您可以使用
ls | sort轻松执行此类任务。有时,不太复杂的解决方案并不明显,或者可能被忽视。 -
伙计们,也许您正在寻找解决特定问题的方法。但我需要的是一个“通用”的答案。因此,我用一个例子问了一个一般性问题,只要求通用答案。
-
事情是你的例子很糟糕。您使用了错误的工具 - 如果您想查找在过去五分钟内创建的文件,请使用
find和-mtime(或其他时间开关)。您的问题是一个相当简单的语法问题。没有通用的“不要在 perl 中使用 foo”,只是 perl 可以做任何 awk 和 sed 可以做的事情。所以只要使用正确的工具。