[英]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.