2016-01-28 162 views
0

我想要使用shell腳本得到top命令的前5行。這是我的shell腳本的輸出。添加時間戳到CSV文件的每一行的末尾

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 

這裏是我的shell腳本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 
+1

't = = $(date +「%T」)'on line 3 is a syntax error。應該有一個等號,兩邊都沒有空格。在發佈之前,您需要通過http://shellcheck.net/運行您的腳本。 – tripleee

+0

在[你以前的問題]中已經指出'while'語法問題(http://stackoverflow.com/questions/34992167/how-to-capture-unix-top-command-output-to-a-csv-文件#comment57712931_34992167)。 – tripleee

+0

@tripleee非常感謝您的建議!根據您的更正,我上次已經編輯了我的代碼。在這裏,我只是從我以前的問題中複製它,忘記編輯while語法! –

回答

1

你在awk命令將在整個文件(或在二審的整個無關的或所沒有的文件)運行,並打印到標準輸出。修復命令以覆蓋輸入文件會爲已有的線添加時間戳。您想要將datestamp添加到將新數據附加到文件的命令中,而不是將更多的日期戳添加到整個文件。

sed腳本已經執行了多次替換。計入時間戳也很簡單。您需要使用雙引號而不是單引號才能使shell擴展變量的值。

#!/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 
+0

我拿出'echo'命令,因爲它們嚴重地妨礙了腳本的可用性。如果你想檢查腳本的進度,可以在'where'運行'tail -f out.txt'。 – tripleee

+0

謝謝你的解決方案! –

+0

沒問題,你應該更好地理解'sed'腳本,這樣你就可以重構它,所以你沒有兩個稍微不同的實例來維護,但是我會等待你的下一個問題...... – tripleee

0

在這一行:

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

您正在使用shell變量$t,單引號裏面,所以它不會得到擴展。使用-v語法shell變量傳遞給AWK:

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

感謝您的解決方案!在終端中獲取確切的輸出,但它不會保存在文件中! :( –

相關問題