如何将 bash 脚本的输出写入包含 headers 的 CSV 文件的第二行?

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

我有一个 bash 脚本,可将其输出写入 CSV 文件的开头。我需要它来维护第一行的 headers。我尝试使用 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 ","  ","  ","  ","  "\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 ","  ","  ","  ","  "\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 ","  ","  ","  ","  "\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 ","  ","  ","  ","  "\n"}' >> /lnxfiler/diskstatus/m_chkdsk.csv

fi

exit

当我运行主脚本时,我需要在header之后添加脚本的所有输出。

 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

这是一个快速重构。

Driver 脚本; don't read lines with 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=[=11=]; next }
  /\/dev/ { print host, date, , , ,  }
  ' /proc/sys/kernel/hostname - |
tee /lnxfiler/diskstatus/m_chkdsk.csv

原始脚本有大量重复,但我当然有可能忽略了 几乎 相同代码片段之间的一些关键差异。这实际上是避免重复自己的原因之一。 根据文件是否已经存在,以略有不同的方式选择性地覆盖远程服务器上的旧结果似乎完全是多余的,所以我把它去掉了。

这假设您在 result.csv 中有旧结果,并且第一行 header 非常难以正确,您必须从旧文件中复制它。只 hard-code 编写新的第一行脚本可能会更容易。

根据您需要的稳健程度,可能实际上将 set -e 添加到两个脚本的开头。如果您不必也将结果存储在远程磁盘上,那将消除主要故障场景之一,并进一步简化脚本。

如果您的 file1.csv 中已有数据,您可以将所有新数据写入 tempfile.csv,然后使用简单的 sed -[=15 将其导入=]

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

这将在第 1 行之后立即读取并添加 tempfile 的内容。