Shell
Shell 腳本 - 將輸出重定向到文件,結果在第一次執行時不符合預期
我已經重定向了命令的輸出,該命令在文件中返回了一些時間 2 行、5 行.. 100 行等.. 我將在稍後的 if 條件下使用這個文件來檢查其他一些條件..
奇怪的是 - 我需要多次執行腳本才能按預期獲取數據..如果我第一次執行腳本它什麼都不返回..請你幫忙為什麼這在第一次執行時沒有給出預期的結果
該程式碼適用於 AIX,如下所示:
df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP if [[ $? -eq 0 ]]; then chmod 777 /tmp/DISKREQ.TMP cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ.TMP cat /tmp/DISKREQ.TMP | while read line do FSIZE_DISKREQ=`df -g | awk '$7 == "'$line'" {print $3;}'` if [[ $FSIZE_DISKREQ -lt 2 ]]; then echo echo " Instance Home Directory $line = $FSIZE_DISKREQ " else echo echo " Instance Home Directory $line " fi done else echo echo "No Instance Home directory Mounted" fi
cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ.TMP
管道的組件是並行執行的。因此,該行並行執行三個命令:
cat /tmp/DISKREQ.TMP
awk '{print$6}'
awk 'length($0) == 22' > /tmp/DISKREQ.TMP
第一個命令是開放
/tmp/DISKREQ.TMP
閱讀。第三個命令/tmp/DISKREQ.TMP
在執行任何其他操作之前被截斷。根據時間的不同,cat
可能有時間也可能沒有時間至少讀取文件的開頭。解決方案:不要寫入與輸入相同的文件。(有更複雜和更脆弱的解決方案可以讓您重用名稱;我不會給出一個,因為在這裡做一些複雜的事情是沒有意義的。)
df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP if [[ $? -eq 0 ]]; then cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ2.TMP cat /tmp/DISKREQ2.TMP | while read line …
(不要使用
chmod 777
。這永遠不會解決任何問題,但會產生問題。)不過,您不需要所有這些臨時文件,因此您可以通過擺脫它們來完全迴避問題。只需將 awk 鏈直接導入 while 循環即可擺脫第二個臨時文件。我還擺脫了無用的用法,
cat
並將這兩個awk
腳本合二為一。df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP if [[ $? -eq 0 ]]; then </tmp/DISKREQ.TMP awk 'length($6) == 22 {print $6}' | while read line do …
您甚至可以完全擺脫
awk
並在while read
循環中進行過濾;我將把它作為練習留給讀者。要擺脫第一個臨時文件,需要稍微更改邏輯。
grep
如果沒有找到任何東西,while 循環體將不會執行,因為它會得到零行來處理,但在這種情況下您需要一些邏輯來顯示消息。END
您可以在 awk中使用指令。df -gt | grep /home/prods/db2/ | awk 'length($6) == 22 {print $6} END {if (NR==0) print "No Instance Home directory Mounted"}' | while read line; do …
您可以將
grep
呼叫與awk
. (練習給讀者。)或者你可以在 shell 中進行整個過濾。我認為這/home/prods/db2/
將永遠是第六列的開始。found=0 df -gt | while read device total used available percent mountpoint; do [[ $mountpoint == /home/prods/db2/* ]] || continue ((++found)) [[ ${#mountpoint} -eq 22 ]] || continue … done if ((found == 0)); then echo "No Instance Home directory Mounted"; fi