为什么不在perl中使用awk?

anu*_*g86 -9 regex perl awk sed

可能这个问题多次被问到能否在你的perl脚本中加入awk one liner.但是这些问题对于以下问题过于具体:

  1. 提供了一种不同的方法作为建议或
  2. 现有代码中的语法已被纠正OR
  3. 大多数时候 - >解决方案是使用perl提供的,因为专家喜欢使用awk或perl,因为他们都做同样的工作.是.也许.但我认为awk是针对特定问题而设计的,这些问题可以在awk中比perl更好地解决.

示例:我有输出,ls -lart第9列是文件名.我很容易在awk中做到这一点ls -lart|awk '{print $9}'.同样的事情当然可以使用perl来完成readdir().但是在perl中提取第8列或第7列并不容易?如果我必须提取数据管道将其管道输送到sed等,情况会变得更糟.

另一个例子: 我有一个特定的DIR,它有许多格式的文件,如:

ABC_9090_DEF_10-22-30_13-07-2014.temp
Run Code Online (Sandbox Code Playgroud)

注意date_time.temp标记部分.这里的格式是ABC_4digits_DEF_hours-minutes-seconds_day-month-year

我想只看到刚刚创建的新文件(比如说从现在起5分钟之前).使用awk/sed的方法是(伪代码,让我知道你是否需要我复制实际的一个班轮):

  1. ls -lart|awk '{print $9}'|
  2. egrep 提取10-22-30_13-07-2014
  3. 使用sed替换_ with - | awk重新排列以具有YEARMONTHDAYHOURSMINUTESSECONDS格式的数字.
  4. 使用awk再次比较这个数字使用if($ 1> $ mynum)对变量(假设有一个相同格式的数字代表TODAYS TIME - 5分钟)

问题: 但由于某种原因(其他复杂性)我想在perl中编写它并且我发现当使用系统命令在perl中使用它时,if条件if($ 1> $ mynum)会抛出错误.它说使用'>'语法错误,即使使用单引号,双引号,没有引号.

有人可以告诉我一般情况:

  1. 如果给出选择,为什么有人不会在这种情况下使用awk,sed而不是perl?
  2. 在perl中包含awk或sed时应该记住的事情的一般解释不是特定于这个问题(希望也应该解决这个特定的问题).

jm6*_*666 6

如果给出选择,为什么有人不会在这种情况下使用awk,sed而不是perl?

如果你喜欢这个想法:

  • 从perl派一个shell
  • 在一个shell里面
  • 再次分叉两个进程(ls和awk)什么只打印第9列

随意做.这对我来说听起来很糟糕,但你知道:你的里程......

在perl中包含awk或sed时应该记住的事情的通用解释不是特定于这个问题(希望也应该解决这个特定的问题:))

要记住的通用事项:

  • 逃避规则$variables- 就像$9可以解释的那样:
    • 通过perl本身(例如,$9可以是存储正则表达式捕获的perl变量)
    • 通过分叉壳(例如$9可以是shell保持第9个位置arg 的变量)
    • awk(这意味着第9列)
  • 知道如何处理系统错误代码
  • 主要是 - 任何编程任务至少需要知道所用编程语言的基础知识.(这就像我的英语 - 这很可怕,但写得很好答案):)

举个例子:这ls -lart|awk '{print $9}是你能做的最糟糕的事情之一.

想像:

  • 如果您有名字的文件: this is my file.txt
  • 打印什么ls -lart|awk '{print $9}

猜错了,只打印出来的this.当然,这是错误的.解析文件名是什么来源于stdin始终是可怕的想法(除非你有NULL结尾的文件名),因为文件名可以包含空格-不仅spaces但是tab还是newline人物了.

第二个例子:

  • 而不是在链(管道)中运行4个程序,你可以find用来实现想要的:print only new files modified in the last 5 min
  • 使用perl你可以使用perl模块: