如何将 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
的内容。
我有一个 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
的内容。