[英]How to print something to the right-most of the console in Linux shell script
假设我要在一堆日志文件中搜索“ ERROR”。
我想为每个包含“ ERROR”的文件打印一行。
在每一行中,我想在最左边打印日志文件路径,而在最右边打印“错误”数。
我尝试使用:
printf "%-50s %d" $filePath $errorNumber
...但这并不完美,因为黑色控制台的差异很大,有时文件路径可能会很长。
只是为了让眼睛愉悦,但我根本无能为力。 谁能帮我解决这个问题?
使用bash
和printf
:
printf "%-$(( COLUMNS - ${#errorNumber} ))s%s" \
"$filePath" "$errorNumber"
这个怎么运作:
$COLUMNS
是外壳的端子宽度。
printf
通过在%
后面加上-
进行左对齐。 因此, printf "%-25s%s\\n" foo bar
打印“ foo ”,然后是22个空格,然后是“ bar ”。
bash
使用#
作为参数长度变量前缀,因此,如果x=foo
,则${#x}
为3 。
花式版本,假设两个变量的长度大于一栏的长度 。 如果是这样,请根据需要在尽可能多的行上进行打印:
printf "%-$(( COLUMNS * ( 1 + ( ${#filePath} + ${#errorNumber} ) / COLUMNS ) \
- ${#errorNumber} ))s%s" "$filePath" "$errorNumber"
泛化为一个函数。 语法是printfLR foo bar
或printfLR < file
:
printfLR() { if [ "$1" ] ; then echo "$@" ; else cat ; fi |
while read l r ; do
printf "%-$(( ( 1 + ( ${#l} + ${#r} ) / COLUMNS ) \
* COLUMNS - ${#r} ))s%s" "$l" "$r"
done ; }
测试:
# command line args
printfLR foo bar
# stdin
fortune | tr -s ' \t' '\n\n' | paste - - | printfLR
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.