如何在固定长度的块中打印可变长度的线?

时间:2012-02-03 17:06:53

标签: bash printing newline break

我需要分析(使用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对于这样的东西应该很方便。

3 个答案:

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