【问题标题】:Why does awk behave differently in terminal vs in a perl script?为什么 awk 在终端和 perl 脚本中的行为不同?
【发布时间】:2023-03-31 20:09:02
【问题描述】:

我想在目录中第一次出现匹配某种模式的文件。这是我正在使用的命令。

ls my/file/path/pattern* | awk '{print $1}'

我的目录是否应该包含文件 pattern1、pattern2、pattern3 等... 这个命令只会返回 pattern1。这在终端窗口中按预期工作。

它在 perl 脚本中失败。我的命令是

push @arr, `ls path/to/my/dir/pattern* | awk \'{print \$1}\'`;
print @arr;

这里的输出是

pattern1
pattern2
pattern3

我希望输出仅为模式 1。为什么 ls 的全部输出都转储到数组中?

编辑:我找到了一种解决方法

my $temp =  (`ls path/to/my/dir/pattern* | awk \'{print \$1}\'`)[0];

但我仍然很好奇为什么其他方式行不通。

编辑:有几个评论者说我的终端命令不像我描述的那样工作,所以这是一个屏幕截图。我知道 awk 返回每一行的第一列,但如果只有几个文件匹配,它应该可以像我描述的那样工作。

【问题讨论】:

  • my $dir = glob '/path/to/glob*'; (虽然你所说的“第一个”是什么意思?按某种排序顺序排列第一个,或者任何随机结果都会这样做?)
  • 我从您的第一个示例中得到 pattern1 pattern2 pattern3(每个示例都在 1 行)。哈哈,perl 内部的awk 一定会让 perl 变得疯狂;-! perl 支持print[f]$1 等符号。祝你好运。
  • 我不认为 awk 命令会给出你所说的结果。
  • @shellter 我总是惊讶于我们看到有多少问题询问如何修复从 perl 或 python 对 awk 或 sed 的调用。让我想知道这些脚本中还发生了什么!
  • 您的ls 是否别名为ls -C 或类似名称?运行alias ls 来查看。 (顺便说一句,这只是解析 ls 输出是一个 Bad Idea™ 的原因之一,即使在 Bash 脚本中也是如此。在 Perl 中,使用纯 Perl 命令,如 globreaddir 而不是依赖于你的行为壳。)

标签: bash perl awk


【解决方案1】:

解决了!当我在术语窗口中执行 ls 时,结果如下所示

file1 file2 file3
file4 file5 file6

但是perl命令

my $test = `ls`;

这样存储结果

file1
file2
file3
file4
file5
file6

由于 awk '{print $1}' 在每行的第 1 列中返回匹配结果,因此运行命令

ls file* | awk '{print $1}'

在 perl 中返回所有匹配项。

【讨论】:

  • 与 Perl 无关。当从任何脚本调用时,ls 将其输出放在一个列中。这是为什么不使用 ls 的一个很好的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2021-04-29
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多