簡體   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