繁体   English   中英

如何在Linux Shell脚本中将内容打印到控制台的最右侧

[英]How to print something to the right-most of the console in Linux shell script

假设我要在一堆日志文件中搜索“ ERROR”。

我想为每个包含“ ERROR”的文件打印一行。

在每一行中,我想在最左边打印日志文件路径,而在最右边打印“错误”数。

我尝试使用:

printf "%-50s %d" $filePath $errorNumber

...但这并不完美,因为黑色控制台的差异很大,有时文件路径可能会很长。

只是为了让眼睛愉悦,但我根本无能为力。 谁能帮我解决这个问题?

使用bashprintf

printf "%-$(( COLUMNS - ${#errorNumber} ))s%s" \
       "$filePath" "$errorNumber"

这个怎么运作:

  1. $COLUMNS是外壳的端子宽度。

  2. printf通过在%后面加上-进行左对齐。 因此, printf "%-25s%s\\n" foo bar打印“ foo ”,然后是22个空格,然后是“ bar ”。

  3. bash使用#作为参数长度变量前缀,因此,如果x=foo ,则${#x}3


花式版本,假设两个变量的长度大于一栏的长度 如果是这样,请根据需要在尽可能多的行上进行打印:

printf "%-$(( COLUMNS * ( 1 + ( ${#filePath} + ${#errorNumber} ) / COLUMNS ) \
          - ${#errorNumber} ))s%s"   "$filePath" "$errorNumber"

泛化为一个函数。 语法是printfLR foo barprintfLR < 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM