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 idea。 find
和 shell 都提供了对困难文件名的出色处理。
这不是 awk
的正确用例,你最好使用这样的东西
find . -maxdepth 1 -type f -exec cat -n {} \;
解决了您的问题并包含有用的建议,但让我关注 语法 方面:
作为命令string,cat -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 }'
我想将某些命令的输出重定向到 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 idea。find
和 shell 都提供了对困难文件名的出色处理。
这不是 awk
的正确用例,你最好使用这样的东西
find . -maxdepth 1 -type f -exec cat -n {} \;
作为命令string,cat -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 }'