Добавьте метку времени в конец каждой строки файла CSV

Я пытаюсь получить первые 5 строк верхней команды с помощью сценария оболочки. Вот вывод моего сценария оболочки.

PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND
3983,arun,20,0,1874616,500356,24132,R,47.6,10.3,53:19.92,gnome-shell
11,root,20,0,0,0,0,R,4.8,0.0,0:22.51,rcuos/0
2016,root,20,0,219396,44408,9120,S,4.8,0.9,9:53.96,Xorg
12081,arun,20,0,2689552,304132,7076,S,4.8,6.3,13:36.17,java
1,root,20,0,141660,5336,2940,S,0.0,0.1,0:08.40,systemd
3983,arun,20,0,1874616,500356,24132,R,56.2,10.3,53:20.99,gnome-shell
2016,root,20,0,219396,44408,9120,R,18.8,0.9,9:54.17,Xorg
4969,arun,20,0,1287084,162948,48472,S,12.5,3.4,5:39.99,chrome
16108,arun,20,0,130020,1692,1172,R,6.2,0.0,0:00.01,top
1,root,20,0,141660,5336,2940,S,0.0,0.1,0:08.40,systemd
3983,arun,20,0,1874616,500356,24132,R,43.8,10.3,53:24.56,gnome-shell
4969,arun,20,0,1275992,147104,32424,S,37.5,3.0,5:41.10,chrome
1,root,20,0,141660,5336,2940,S,0.0,0.1,0:08.40,systemd
2,root,20,0,0,0,0,S,0.0,0.0,0:00.06,kthreadd
3,root,20,0,0,0,0,S,0.0,0.0,0:04.93,ksoftirqd/0

Вот мой скрипт оболочки top.sh

 #!/bin/bash
echo "started.."
top -b -n 3 | sed -n '7,1{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt

while [ true ]; do
  sleep 5
  echo "inside loop.."
  top -b -n 3 | sed -n '8,12{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt
done

Теперь мне нужно добавить метку времени в конце каждой строки. Я пытался сделать то же самое, используя awk команда, но это не сработало для меня! Я отредактировал мой код следующим образом:

#!/bin/bash
    echo "started.."
    t= =$(date +"%T")

    top -b -n 3 | sed -n '7,1{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt
    awk -F, '{$(NF+1)="TIME";}1' OFS=, out.txt    

    while [ true ]; do
      sleep 5
      t=$(date +"%T")
      echo "inside loop.."
      top -b -n 3 | sed -n '8,12{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt
      awk -F, '{$(NF+1)=$t;}1' OFS=, file
    done

2 ответа

Решение

Ваши команды Awk будут выполняться по всему файлу (или по всему несвязанному или несуществующему файлу во втором экземпляре) и выводиться на стандартный вывод. Исправление команды перезаписи входного файла добавит метки времени к строкам, в которых они уже есть. Вы хотите встроить добавление даты в команду, которая добавляет новые данные в файл, вместо того, чтобы в любом случае добавлять дополнительные метки даты во весь файл.

sed Скрипт уже выполняет ряд замен. Также просто учитывать временную метку. Вам нужно будет использовать двойные кавычки вместо одинарных, чтобы оболочка расширила значение переменной.

#!/bin/bash

t=$(date +"%T")   #### Syntax error fixed
top -b -n 3 |
sed -n -e '7!b;s/^ *//' -e "s/ *$/,$t/" -e 's/  */,/gp;q' >> out.txt
#### ^sed script refactored; only work on line 7, not until 12

while true; do   #### Wacky syntax fixed
  sleep 5
  t=$(date +"%T")
  top -b -n 3 |
  sed -n -e '8,12{s/^ *//' -e "s/ *$/,$t/" -e 's/  */,/gp;};12q' >> out.txt
done

В этой строке:

awk -F, '{$(NF+1)=$t;}1' OFS=, file

вы используете переменную оболочки $tвнутри одинарных кавычек, поэтому он не раскрывается. Использовать -v синтаксис для передачи переменных оболочки в awk:

awk -F, -v OFS=, -v t="$t" '{$(NF+1)=t;}1'  file
Другие вопросы по тегам