我有一个从目录中过滤文件列表的过程(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"; }