![](/img/trans.png)
[英]How do I delete all lines from a file after (and including) a line that contains a defined string in a Bash script?
[英]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.