gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:40 33 4
gpt4 key购买 nike

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

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

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

我尝试使用:

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

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

只为赏心悦目,而我根本无能为力。谁能帮我解决这个问题?

最佳答案

使用 bashprintf :

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

工作原理:

  1. $COLUMNS是 shell 的终端宽度。

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

关于linux - 如何在 Linux shell 脚本中将内容打印到控制台的最右侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43664070/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com