dfを使用して、特定の列に対してawkを試してください。

dfを使用して、特定の列に対してawkを試してください。

私が作成しようとしているこのスクリプトに関する別の質問では、これは私が作成した最初のunix / linuxスクリプトです。dfを使用して使用されているディスク容量の割合を取得し、それをルートディレクトリに電子メールで送信しようとしています。 。私たちの指示は、dfから/procフロッピーとCDROMを除外することです。

私が今まで持っているもの:

fsExclude=(/proc /dev/floppy /dev/cdrom) #Exclusions from df file system
fsUsed=15 #percent to watch for
WarnEmail=root #email for warning message
if (df -x $fsExclude | awk '$5' | sed '2p' > fsUsed)
then
df -h > dfFile.tmp
mail -s "WARNING: Almost out of disk space %" '$WarnEmail' < dfFile.tmp
rm dfFile.tmp
fi

今、私はこれにいくつかの問題があることを知っています。どのような出力が出てくるのかを確認するために実行すると、次のような結果が出ます(最初の行は私が含まれていないifステートメントの上にあるメッセージです)。

Emailing admin, disk almost full...
3 
$WarnEmail... User unknown 
60 
awk:    cmd. line:1: print $4 
awk: cmd. line:1: ^ parse error    
/root/dead.letter... Saved message in /root/dead.letter 

もっとたくさんありますが、後で保存します。何の問題もなく、同様の方法でスクリプトの外部にルートをメールで送信しましたが、スクリプト内では機能しません。 dfのawk出力を使用して%used列から値を取得し、fsUsed値より大きいか小さいかを確認したいと思います。もしそうなら、あなたの完全なdf出力をルートに電子メールで送ってください。私が検索したときに、誰かが-percまたは-availで何かを使用するように提案するのを見ましたが、ここではどちらも機能しません。不明というメッセージが表示されるので、awkに戻ろうとします。

この問題の解決にご協力いただきありがとうございます。

ベストアンサー1

あなたが持っている主な問題は

  1. fsExcludeは配列であり、必要なすべての要素を取得するには、${array[@]}とにかくこの-xオプションにはデバイスではなくファイルシステムの種類が必要です。

  2. コマンドに構文エラーがありますawk

    awk '{print $5}' 
    

    それ以外の場合は、print5番目のフィールドがあるかどうかを評価する式が使用されるため、awk5つ以上のフィールドを含むすべての行が印刷されます。$5true

  3. あなたの目標を理解したら、現在の割合を値と比較したいようですfsUsed。ただし、コマンドを実行するとというファイルが生成され、fsUsedそのファイルの出力が印刷されますdf。あなたが望むもの

    if [ "$(df -x $fsExclude | awk '$5' | sed '2p')" -gt "$fsUsed" ]
    

    $()~と呼ばれるコマンドの置き換え実行するすべてのコマンドの出力に展開されます。比較したいのがこれです。そしてfsUsed必要な価値を得るために$

  4. 一重引用符があります$WarnEMail。これは、変数ではなく文字列リテラルとして扱われることを意味します。この試み:

    mail -s "WARNING: Almost out of disk space %" "$WarnEmail" < dfFile.tmp
    
  5. コマンドはdf複数の行を返しますが、単一の比較を実行しているため動作しません。df出力のすべての行を確認する必要があります。

これにより、不必要に複雑な方法で作業を実行できます。なぜできないのですか?

#!/bin/bash
fsExclude="/proc|/dev/floppy|/dev/cdrom" #Exclusions from df file system
fsUsed=15 #percent to watch for
WarnEmail=root #email for warning message
problem=0;
df | grep -v "$fsExclude" |
    while read line
    do
    ## Check the percentage, send the mail if at least
    ## one mount point's percentage is > $fsUsed
    if [[ $(grep -oE '[0-9]+%' <<<"$line" | tr -d '%') -gt $fsUsed ]]
    then
        ## I'm not sure if `command | mail` works and I don't have a system
        ## I can test it on. If it doesn't, use a file as you did before. 
        df -h | mail -s "WARNING: Almost out of disk space %" "$WarnEmail" 
        ## No need to rpocess any more lines, exit the while loop
        break;
    fi
    done

おすすめ記事