【发布时间】:2016-09-02 04:46:39
【问题描述】:
我想将某些命令的输出重定向到 awk 并在 awk 中使用系统调用。但是 awk 不接受带有连字符的标志。例如,假设我有一堆文件,我想“cat”它们。我会使用ls -1 | awk '{ system(" cat " $1)}'
现在,如果我还想用-n 打印行号,那么ls -1 | awk '{ system(" cat -n" $1)}' 不起作用
【问题讨论】:
我想将某些命令的输出重定向到 awk 并在 awk 中使用系统调用。但是 awk 不接受带有连字符的标志。例如,假设我有一堆文件,我想“cat”它们。我会使用ls -1 | awk '{ system(" cat " $1)}'
现在,如果我还想用-n 打印行号,那么ls -1 | awk '{ system(" cat -n" $1)}' 不起作用
【问题讨论】:
-n 和文件名之间需要一个空格:
ls -1 | awk '{ system(" cat -n " $1)}'
-1 不需要。 ls 在输出到管道时每行隐式打印 1 个文件。
任何包含空格的文件名都会导致此代码失败。
解析ls的输出一般为a bad idea。 find 和 shell 都对难处理的文件名提供了出色的处理。
【讨论】:
ls -1 | awk '{ system("cat -n \047" $1 "\047")}' 以防止通配,变量扩展, 文件名扩展等
John1024's helpful answer 解决了您的问题并包含有用的建议,但让我专注于 语法 方面:
作为命令字符串,cat -n <file> 需要在n 和<file> 之间至少有1 个空格(或制表符),这是一个选项,这是一个操作数。
字符串连接在awk 中的工作方式不同,而不是在 shell 中:
" cat -n" $1,尽管在" cat -n" 和$1 之间存在一个空格,不 不会在结果字符串中插入该空格,因为 awk 的字符串连接通过直接连接彼此相邻的字符串来工作无论中间有空格。
例如,以下命令都产生字符串文字ab,而与字符串连接的操作数之间的任何空格无关:
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 的合适用例,你最好用这样的东西
find . -maxdepth 1 -type f -exec cat -n {} \;
【讨论】:
ls -1 在问题中的使用,cat * 行应该可以完成这项工作。
cat * 将有一个长序列,不会重置每个文件的行号。
cat 也是如此(这是恰当的,因为这个问题被标记为 linux),但是,作为一个兴趣点, BSD cat(至少是 OS X 10.11.4 附带的版本)用cat -n 对输入文件的行per file 编号。