簡體   English   中英

如何將 bash 腳本的輸出寫入包含標題的 CSV 文件的第二行?

[英]How do I write an output from bash script to the second line of the CSV file that contains headers?

我有一個 bash 腳本,可以將其輸出寫入 CSV 文件的開頭。 我需要它來維護第一行的標題。 我嘗試使用 awk 和 sed 但沒有成功。

我得到了用於建立 SSH 連接的主腳本:

for n in $(cat list.txt)
do
ssh -t root@$n /etc/m_chkdsk_app.sh
done

list.txt 包含服務器名稱

 server1
 server2
 server3
 server4

並在遠程計算機上運行以下腳本

if [ -f   /lnxfiler/diskstatus/m_chkdsk.csv  ]
then
    printf "$(cat /proc/sys/kernel/hostname)" >> /lnxfiler/diskstatus/New_m_chkdsk.csv && printf "," >> /lnxfiler/diskstatus/New_m_chkdsk.csv && printf "$(date +%d-%m-%Y)" >> /lnxfiler/diskstatus/New_m_chkdsk.csv && df -h | grep /dev/mapper/rootvg-var | awk '{printf "," $2 "," $3 "," $5 "," $6 "\n"}' >> /lnxfiler/diskstatus/New_m_chkdsk.csv

    printf "$(cat /proc/sys/kernel/hostname)" >> /lnxfiler/diskstatus/New_m_chkdsk.csv && printf "," >> /lnxfiler/diskstatus/New_m_chkdsk.csv && printf "$(date +%d-%m-%Y)" >> /lnxfiler/diskstatus/New_m_chkdsk.csv && df -h | grep "/dev/mapper/rootvg-sap " | awk '{printf "," $2 "," $3 "," $5 "," $6 "\n"}' >> /lnxfiler/diskstatus/New_m_chkdsk.csv

    cat /lnxfiler/diskstatus/m_chkdsk.csv       >> /lnxfiler/diskstatus/New_m_chkdsk.csv
    mv /lnxfiler/diskstatus/New_m_chkdsk.csv   /lnxfiler/diskstatus/m_chkdsk.csv

else

    printf "$(cat /proc/sys/kernel/hostname)" >> /lnxfiler/diskstatus/m_chkdsk.csv && printf "," >> /lnxfiler/diskstatus/m_chkdsk.csv && printf "$(date +%d-%m-%Y)" >> /lnxfiler/diskstatus/m_chkdsk.csv && df -h | grep /dev/mapper/rootvg-var | awk '{printf "," $2 "," $3 "," $5 "," $6 "\n"}' >> /lnxfiler/diskstatus/m_chkdsk.csv

    printf "$(cat /proc/sys/kernel/hostname)" >> /lnxfiler/diskstatus/m_chkdsk.csv && printf "," >> /lnxfiler/diskstatus/m_chkdsk.csv && printf "$(date +%d-%m-%Y)" >> /lnxfiler/diskstatus/m_chkdsk.csv && df -h | grep "/dev/mapper/rootvg-sap " | awk '{printf "," $2 "," $3 "," $5 "," $6 "\n"}' >> /lnxfiler/diskstatus/m_chkdsk.csv

fi

exit

當我運行主腳本時,我需要將腳本的所有輸出添加到標題之后。

 Server Name,Date,Disk Size,Used,Use%,Mounted on
 server1,08-09-2020,2.0G,363M,20%,/var
 server1,08-09-2020,15G,41M,1%,/usr/sap
 server1,08-09-2020,200G,237M,1%,/suse_manager
 server2,08-09-2020,2.0G,138M,8%,/var
 server2,08-09-2020,20G,6.6G,36%,/srv
 server2,08-09-2020,80G,6.7G,9%,/srv/NFS
 server3,08-09-2020,2.0G,363M,20%,/var
 server3,08-09-2020,15G,41M,1%,/usr/sap
 server4,08-09-2020,2.0G,138M,8%,/var
 server4,08-09-2020,20G,6.6G,36%,/srv
 server4,08-09-2020,80G,6.7G,9%,/srv/NFS

這是一個快速重構。

驅動腳本; 不要閱讀帶有for

head -n 1 result.csv >newresult.csv
while IFS= read -r host; do
do
    ssh -t "root@$host" /etc/m_chkdsk_app.sh </dev/null
done < list.txt >>newresult.csv
mv newresult.csv result.csv

遠程腳本:

df -h /dev/mapper/rootvg-var /dev/mapper/rootvg-sap | 
awk -v date=$(date +%d-%m-%Y) 'BEGIN { OFS="," }
  NR==FNR { host=$0; next }
  /\/dev/ { print host, date, $2, $3, $5, $6 }
  ' /proc/sys/kernel/hostname - |
tee /lnxfiler/diskstatus/m_chkdsk.csv

原始腳本有大量的重復,但我當然可能忽略了幾乎相同的代碼片段之間的一些關鍵區別。 這實際上是避免重復自己的原因之一。 根據文件是否已經存在,以稍微不同的方式選擇性地覆蓋遠程服務器上的舊結果似乎完全是多余的,所以我把它去掉了。

這假設您在result.csv有舊結果,並且第一個標題行非常難以正確,以至於您必須從舊文件中復制它。 僅對腳本進行硬編碼以編寫新的第一行可能會更容易。

根據您需要的健壯程度,可能實際上將set -e添加到兩個腳本的開頭。 如果您並非絕對必須將結果也存儲在遠程磁盤上,那么這將消除主要故障場景之一,並且更加簡化腳本。

如果您有一個包含數據的file1.csv ,您可以將所有新數據寫入tempfile.csv ,然后使用簡單的sed將其導入 -

sed -i '1rtempfile.csv' file1.csv

這將在第 1 行之后立即讀取並添加tempfile的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM