awk 系统不带连字符

awk system does not take hyphens

我想将某些命令的输出重定向到 awk 并在 awk 中使用系统调用。但是 Awk 不接受带有连字符的标志。例如,假设我有一堆文件,我想 "cat" 它们。我会用 ls -1 | awk '{ system(" cat " )}'

现在,如果我还想用 -n 打印行号,那么它不起作用 ls -1 | awk '{ system(" cat -n" )}'

您需要在 -n 和文件名之间添加一个 space:

ls -1 | awk '{ system(" cat -n " )}'

备注

  • -1 不需要。 ls 当输出到管道时,每行隐式打印 1 个文件。

  • 任何带有白色space的文件名都会导致此代码失败。

  • 解析ls的输出一般是a bad ideafind 和 shell 都提供了对困难文件名的出色处理。

这不是 awk 的正确用例,你最好使用这样的东西

find . -maxdepth 1 -type f -exec cat -n {} \; 

解决了您的问题并包含有用的建议,但让我关注 语法 方面:

作为命令stringcat -n <file>需要在n之间至少有1个space(或制表符),这是一个选项<file>,这是一个操作数

字符串连接在 awk 中的工作方式与在 shell 中的 不同:

" cat -n" ,尽管 " cat -n"</code> 之间存在 space,<em> 不会 </em> 插入那个 space 在结果字符串中,因为 <strong><code>awk 的字符串连接是通过直接连接彼此相邻的字符串来工作的 而不管中间的白色 space.

例如,以下命令都产生字符串文字 ab,而不管字符串连接的操作数之间是否有任何白色 space:

awk 'BEGIN { print "a""b" }'
awk 'BEGIN { print "a"         "b" }'
awk 'BEGIN { s = "b"; print "a"s }'
awk 'BEGIN { s = "b"; print "a"          s }'