如何以固定长度块打印可变长度行?

发布于 2025-01-01 18:06:01 字数 786 浏览 0 评论 0原文

我需要分析(使用grep)并打印(使用一些格式)一个文件的内容 应用程序的日志。

该日志包含可变长度行的文本数据。我需要的是,经过一些 grep 后,循环输出的每一行并以最大固定长度 50 个字符打印它。如果一行超过 50 个字符,它应该打印一个换行符,然后继续下一行的其余部分,依此类推,直到该行完成。

我尝试使用 printf 来执行此操作,但它不起作用,我不知道为什么。尽管 \t 字符(制表符)有效,但它只是以与 echo 相同的方式输出行,而不考虑 printf 格式。

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 对于这样的事情应该很方便。

I need to to analyze (with grep) and print (with some formatting) the content of an
app's log.

This log contains text data in variable length lines. What I need is, after some grepping, loop each line of this output and print it with a maximum fixed length of 50 characters. If a line is longer than 50 chars, it should print a newline and then continue with the rest in the following line and so on until the line is completed.

I tried to use printf to do this, but it's not working and I don't know why. It just outputs the lines in same fashion of echo, without any consideration about printf formatting, though the \t character (tab) works.

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

}

What's wrong? I Know that I can make a substring routine to accomplish this task, but printf should be handy for stuff like this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

过期情话 2025-01-08 18:06:01

而不是:

printf "\t%50s\n" "$line"

用于

printf "\t%.50s\n" "$line"

将行截断为仅 50 个字符。

Instead of:

printf "\t%50s\n" "$line"

use

printf "\t%.50s\n" "$line"

to truncate your line to 50 characters only.

够运 2025-01-08 18:06:01

我不确定 printf,但看到 perl 是如何安装在任何地方的,一个简单的 1 行怎么样?


echo $ln | perl -ne ' while( m/.{1,50}/g ){ print "
amp;\n" } '

I'm not sure about printf but seeing as how perl is installed everywhere, how about a simple 1 liner?


echo $ln | perl -ne ' while( m/.{1,50}/g ){ print "
amp;\n" } '

少年亿悲伤 2025-01-08 18:06:01

这是一种仅使用 bash 的笨拙方法,可将字符串分成 50 个字符的块

i=0
chars=50
while [[ -n "${y:$((chars*i)):$chars}" ]]; do
  printf "\t%s\n" "${y:$((chars*i)):$chars}"
  ((i++))
done

Here's a clunky bash-only way to break the string into 50-character chunks

i=0
chars=50
while [[ -n "${y:$((chars*i)):$chars}" ]]; do
  printf "\t%s\n" "${y:$((chars*i)):$chars}"
  ((i++))
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文