【问题标题】:I have a script that gives an output on the screen and puts that data in a logfile but i want that data in another format. How can i do this?我有一个脚本,它在屏幕上提供输出并将该数据放入日志文件中,但我希望该数据采用另一种格式。我怎样才能做到这一点?
【发布时间】:2019-05-25 22:38:58
【问题描述】:

我有这个脚本,它可以每隔一段时间在屏幕上显示输出,并将其保存在 log.txt 文件中。但我希望它以不同的方式保存在我的 log.txt 文件中。

我的脚本是这样的:

  1 #!/bin/bash
  2
  3 while [ 1 ]
  4 do
  5 echo "Downloadspeed in Mbps:"
  6 speedtest-cli --simple | grep Download | awk '{print $2}' | tee -a log.txt
  7 echo "TIJD:"
  8 date "+%T" | tee -a log.txt
  9 echo "DATUM:"
 10 date "+%D" | tee -a log.txt
 11 echo ""
 12 sleep $1m
 13 done

示例 log.txt 如下所示:

46.91
01:46:40
12/28/18
41.84
01:48:04
12/28/18
43.65
01:49:25
12/28/18

但我希望它看起来像这样:

12/28/18 01:46:40 ,46.91            
12/28/18 01:48:04 ,41.84        
12/28/18 01:49:25 ,43.65

有人可以帮我重写我的脚本以在我的 log.txt 文件中获取其他格式吗?

问候

托马斯·范豪特

【问题讨论】:

  • 不要将grep 传递给awk。相反,写awk '/Download/{print $2}'

标签: bash logging linux-mint


【解决方案1】:

由于我不清楚您是如何生成输出文件的,因此根据您的要求处理输出文件以获得预期的输出,并考虑到您显示的示例是 Input_file 的样子。

awk '++count==1{val1=$0;next}  ++count==2{val2=$0;next} ++count==3{print $0,val1" ,"val2;val1=val2=count=""}'  Input_file

【讨论】:

    【解决方案2】:

    只需引入一些变量并相应地格式化您的输出。

    应该这样做:

    #!/bin/bash
    
    while [ 1 ] 
    do
        the_speed=`speedtest-cli --simple | grep Download | awk '{print $2}'`
        the_date=`date "+%D"`
        the_time=`date "+%T"`
    
        echo "Download speed in Mbps: $the_speed"
        echo "Date: $the_date"
        echo "Time: $the_time"
        echo ""
    
        echo "$the_date $the_time, $the_speed" >> log.txt
    
        sleep $1m 
    done
    

    【讨论】:

      【解决方案3】:

      我最喜欢的技巧之一(我已经这样做太久了)是使用 xargs -L 将多行合并为一条。

      我将从最终答案开始,我会告诉你我是如何到达那里的:

      tail -r log.txt | xargs -L3 | tail -r | awk '{ print $1 , $2, ","  $3 }'
      

      好吧,让我们从 xargs -L3 开始:

      xargs -L3 <log.txt 
      

      上面的结果接近你想要的:

      $ xargs -L3 <log.txt
      46.91 01:46:40 12/28/18
      41.84 01:48:04 12/28/18
      43.65 01:49:25 12/28/18
      

      显然,列的顺序是错误的。所以我们先把文件倒过来:

      $ tail -r < log.txt
      12/28/18
      01:49:25
      43.65
      12/28/18
      01:48:04
      41.84
      12/28/18
      01:46:40
      46.91
      

      现在文件被反转了,让我们再次通过 xargs 管道:

      $ tail -r < log.txt | xargs -L3 
      12/28/18 01:49:25 43.65
      12/28/18 01:48:04 41.84
      12/28/18 01:46:40 46.91
      

      正如你在上面看到的,列的顺序是正确的,但是行是相反的。让我们再次使用 tail -r 命令来反转文件:

      $ tail -r < log.txt | xargs -L3  | tail -r
      12/28/18 01:46:40 46.91
      12/28/18 01:48:04 41.84
      12/28/18 01:49:25 43.65
      

      现在结果的顺序正确,但我们缺少逗号 (,)。我们可以用 awk 或 sed 把它放进去。我喜欢 awk:

      $ tail -r < log.txt | xargs -L3  | tail -r | awk '{ print $1 , $2, ","  $3 }'
      12/28/18 01:46:40 ,46.91
      12/28/18 01:48:04 ,41.84
      12/28/18 01:49:25 ,43.65
      

      但如果你是 sed 的粉丝,你可以这样尝试:

      $ tail -r < log.txt | xargs -L3  | tail -r | sed 's/:.. /&,/'
      12/28/18 01:46:40 ,46.91
      12/28/18 01:48:04 ,41.84
      12/28/18 01:49:25 ,43.65
      

      上面的命令很简单,但只有当你有一个结束的输入时它才会起作用。也就是说,如果输入流是连续的,'tail -r' 不起作用,因为它需要在反转输入之前读取到 EOF。所以,我给你的这个命令只有在你跳出循环并后处理 log.txt 文件时才真正有用。

      【讨论】:

        【解决方案4】:

        这个awk 可能对你有用:

        $ awk '{a[NR%3]=$0}NR%3==0{print a[0] " " a[2] " ," a[1]}' file
        12/28/18 01:46:40 ,46.91
        12/28/18 01:48:04 ,41.84
        12/28/18 01:49:25 ,43.65
        

        可能的sed解决方案:

        $ sed -E 'N;N;s/(.*)\n(.*)\n(.*)/\3 \2 ,\1/' file
        12/28/18 01:46:40 ,46.91
        12/28/18 01:48:04 ,41.84
        12/28/18 01:49:25 ,43.65
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-19
          • 2018-10-05
          相关资源
          最近更新 更多