【问题标题】:awk system does not take hyphensawk 系统不带连字符
【发布时间】:2016-09-02 04:46:39
【问题描述】:

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

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

【问题讨论】:

    标签: linux shell awk cat


    【解决方案1】:

    -n 和文件名之间需要一个空格:

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

    注意事项

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

    • 任何包含空格的文件名都会导致此代码失败。

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

    【讨论】:

    • IF 你真的打算这样做(你不会为这个任务做)那么它应该写成ls -1 | awk '{ system("cat -n \047" $1 "\047")}' 以防止通配,变量扩展, 文件名扩展等
    【解决方案2】:

    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 }'
    

    【讨论】:

      【解决方案3】:

      这不是 awk 的合适用例,你最好用这样的东西

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

      【讨论】:

      • 鉴于ls -1 在问题中的使用,cat * 行应该可以完成这项工作。
      • 谢谢你 karakfa,@John1024。我正在尝试将其与作业调度程序 TORQUE 的 qstat 命令一起使用。 qstat |grep "R 正常" | awk '{system(" qstat -f " $1 "| grep -E \"Remaining|nodes\" ")}'
      • cat * 将有一个长序列,不会重置每个文件的行号。
      • @karakfa:GNU cat 也是如此(这是恰当的,因为这个问题被标记为 linux),但是,作为一个兴趣点, BSD cat(至少是 OS X 10.11.4 附带的版本)用cat -n 对输入文件的行per file 编号。
      • @user2958481 你在评论中输入的命令行是完全错误的方式来做你想做的事情。 awk 不是 shell,因此使用它来调用 shell 命令显然是个坏主意。在许多其他方面,您尝试运行的命令行在概念上和语法上也是错误的——如果您发布一个带有简洁、可测试的示例输入(qstat 的输出)和预期输出的后续问题,那么我们可以为您提供帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多