我已经摆弄这个好几个小时了,但无法让它工作,所以也许我的方法是错误的。
我想漂亮地显示多行消息,因此“标题”位于左侧,然后消息与列中的消息对齐,例如:
WARNING: The quick brown fox jumped over the lazy dog.
Sphinx of black quartz, judge my vow.
How quickly daft jumping zebras vex!
或
NOTE: This happened.
Foo bar.
等等。
我正在尝试根据我能找到的一些答案使用
printf
和 column
来做到这一点,但正如我所说,也许这种方法永远行不通?
目前,我将
printf
的第一个字符串作为“标题”,然后其余的参数是与之对齐的消息,如下所示:
#!/bin/bash
warn() {
printf '%s+%s\n' 'WARNING:' "${@}" | column --table --separator '+'
}
warn "The quick brown fox jumped over the lazy dog." \
"+Sphinx of black quartz, judge my vow." \
"+How quickly daft jumping zebras vex!"
可以类似地这样做吗?或者最好的方法/其他方法是什么?
WARNING: The quick brown fox jumped over the lazy dog.
Sphinx of black quartz, judge my vow. How quickly daft jumping zebras vex!
这是一个简单的例子--
# cat foo.sh
function warn()
{
local title='WARNING:'
local len=${#title} head=$title
local title2
printf -v title2 '%*s' $len " "
for msg; do
printf '%s %s\n' "$head" "$msg"
head=$title2
done
}
warn 'The quick brown fox jumped over the lazy dog.' \
'Sphinx of black quartz, judge my vow.' \
'How quickly daft jumping zebras vex!'
运行它:
# bash foo.sh
WARNING: The quick brown fox jumped over the lazy dog.
Sphinx of black quartz, judge my vow.
How quickly daft jumping zebras vex!
使用一点 Awk 和 Bash,您可以定义如下所示的函数。定义日志级别的参数,
WARNING
、INFO
等,并将其作为参数传递
warn() {
level="$1"
echo "${@:2}" |
awk -v level="$level" -v RS="+" '
BEGIN { align = length(level)+2 }
NR==1 { printf "%-*s%s\n", align, level":", $0; next }
{ printf "%-*s%s\n", align, "", $0 }'
}
并将其称为
warn "WARNING" "The quick brown fox jumped over the lazy dog." \
"+Sphinx of black quartz, judge my vow." \
"+How quickly daft jumping zebras vex!"
产生
WARNING: The quick brown fox jumped over the lazy dog.
Sphinx of black quartz, judge my vow.
How quickly daft jumping zebras vex!
根据您定义的格式字符串运行良好,例如
WARNING
或 NOTE
。