如果 stdout 上有任何输出,如何在 stdout 之前打印条件标头

如果 stdout 上有任何输出,如何在 stdout 之前打印条件标头

我有一个从目录中过滤文件列表的过程(find检查是否有早于特定时间段的文件以显示队列被卡住)。它可能会或可能不会返回任何东西,如果返回,则会通过 邮寄cron

我想知道是否有一个程序或简单的bash方法可以将此输出传送到,以及是否有任何通过它输出,在前面添加一个标题行(例如“这些是卡在队列中的文件”)。

答案1

sed 内联答案:

find ./files -mtime +90|sed '1s/^/Files stuck in queue:\n/'

答案2

由于其他方法实际上并不提供bash方法,正如所要求的:

command | while IFS= read -r line; do
    (( i )) || { printf '%s\n' 'These are the files stuck in the queue:' ; (( i++ )) ; }
    printf '%s\n' "${line}"
done

使用的所有命令都是内部的bash

如果没有输出行,则不会打印任何内容。如果有,将打印标题行,然后输出command.

答案3

当我发现处理输入流时想要保持状态时,我发现 awk 通常是最好的工具。

在这种情况下,您想要处理一个流,如果您看到一些输入,请写出一个标头并记录您已编写该标头。

awk '!input_seen { print "header"; input_seen = 1 } 1'

如果变量input_seen为 false(如果未定义,则默认为 false),这将打印一个标头并将其设置为真值 (1)。最后1是另一条规则,这是一种简写方式:打印当前行 - 您也可以将 替换1{ print }

答案4

或者,

output=$(command)
[[ -n $output ]] && { echo "header"; echo "$output"; }

相关内容