У меня есть сценарий, который выводит данные на экран и помещает эти данные в файл журнала, но я хочу, чтобы эти данные были в другом формате.Как я могу это сделать? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть этот скрипт, который показывает вывод на экран каждый период времени, а также сохраняет его в файле 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?

Привет

Томас Ван Хот

Ответы [ 4 ]

0 голосов
/ 28 декабря 2018

Это 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
0 голосов
/ 28 декабря 2018

Просто введите некоторые переменные и соответствующим образом отформатируйте вывод.

Это должно сделать это:

#!/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
0 голосов
/ 28 декабря 2018

Один из моих любимых приемов (и я делал это слишком долго) - использовать 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.

0 голосов
/ 28 декабря 2018

Поскольку то, как вы генерируете выходной файл, мне неясно, так как ваш запрос работает с выходным файлом, чтобы получить только ожидаемый результат, и учитывая, что ваш показанный пример выглядит как Input_file.

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