Добавьте метку времени в конец каждой строки файла 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