ファイルサイズを監視し、ジョブIDを把握するスクリプトを作成しようとしています。問題は、複数のプロセスが実行されていても、スクリプトが最初のIDのみを返すことです。なぜこれがうまくいかないのか知っていますか?
#!/bin/sh
filename='bigfiles'
find /opt/Logs -type f -size +10k > $filename
count='cat bigfiles | wc -l'
while read -r line
do
pid= more "$line" | grep ID | awk -F '=' '{print $2}'>> pid.txt
done < $filename
さらに、複数のディレクトリをスキャンする必要があり、ログファイルのサイズがファイルシステムの使用率の25%に達すると、スクリプトはファイルをスキャンする必要があります。これをマージする方法について提案がありますか?
whileの代わりにforを使用すると機能します。
for line in $(cat bigfiles)
do echo "$line"
pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt
kill $(more $line | grep JOBID | awk -F '=' '{print $2}')
bhist -l $(more $line | grep JOBID | awk -F '=' '{print $2}') >> hist.txt;
done
答え1
私たちは、あなたが扱っているファイルがどのように見えるのかわからないので、あなたのスクリプトが正しく実行されない理由を言うのは難しいです。私たちが知っているのは、あなたがその文字列を含む行に興味があり、その行の後に続くすべてをID
取得したいということです。=
スクリプトには、2つの未使用変数(count
シェルコマンドを含む文字列)とpid
(空の変数)が含まれています。次のコンテンツに到達するには、まだ多くの困難を経験する必要があります=
。
more "$line" | grep ID | awk -F '=' '{ print $2 }'
コマンドmore
はポケットベルです。これはユーティリティであることを意味します。より文書。grep
以下を使用する代わりに、ファイルを直接読み取ることができます。
grep ID "$line" | awk -F '=' '{ print $2 }'
しかし、ただ自分ができるgrep
ことをするようにしておくだけです。awk
awk -F '=' '/ID/ { print $2 }' "$line"
しかし、我々はより良いことができます。すべてのパス名をファイルに保存する代わりに、ファイルにすべての$filename
操作を実行させることができます。find
find /opt/Logs -type f -size +10k \
-exec awk -F '=' '/ID/ { print $2 }' {} + >pid.txt
/opt/Logs
これにより、10 KB以下のすべての一般ファイルが見つかります。各ファイルについて、=
この文字列を含む各行(最初の行)の後の内容がID
印刷されます。結果はに保存されますpid.txt
。
関連:
答え2
filename='bigfiles' find /opt/Logs -type f -size +10k > $filename
for line in $(cat bigfiles)
do
echo "$line"
pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt
kill $(more $line | grep JOBID | awk -F '=' '{print $2}')
bhist -l $(grep JOBID "$line" | awk -F '=' '{print $2}') >> hist.txt;
done