我需要分析(使用grep
)并打印(使用某种格式化)内容
应用程序的日志。
此日志包含可变长度行的文本数据。我需要的是,在一些grepping之后,循环此输出的每一行并以最大固定长度50个字符打印它。如果一行超过50个字符,则应打印换行符,然后继续使用以下行中的其余行,依此类推,直到该行完成。
我尝试使用printf
来执行此操作,但它不起作用,我不知道为什么。它只是以echo
的相同方式输出行,而不考虑printf
格式,尽管\t
字符(制表符)有效。
function printContext
{
str="$1"
log="$2"
tmp="/tmp/deluge/$$"
rm -f $tmp
echo ""
echo -e "\tLog entries for $str :"
ln=$(grep -F "$str" "$log" &> "$tmp" ; cat "$tmp" | wc -l)
if [ $ln -gt 0 ];
then
while read line
do
printf "\t%50s\n" "$line"
done < $tmp
fi
}
怎么了?我知道我可以创建一个子字符串例程来完成这个任务,但printf
对于这样的东西应该很方便。
答案 0 :(得分:4)
而不是:
printf "\t%50s\n" "$line"
使用
printf "\t%.50s\n" "$line"
将您的行截断为仅50个字符。
答案 1 :(得分:0)
我不确定printf,但看到perl如何安装在各处,简单的1衬垫怎么样?
echo $ln | perl -ne ' while( m/.{1,50}/g ){ print "$&\n" } '
答案 2 :(得分:0)
这是一个笨重的bash唯一方法将字符串分成50个字符的块
i=0
chars=50
while [[ -n "${y:$((chars*i)):$chars}" ]]; do
printf "\t%s\n" "${y:$((chars*i)):$chars}"
((i++))
done