シェルスクリプトが正しく報告されません。

シェルスクリプトが正しく報告されません。

ファイルサイズを監視し、ジョブ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

関連:

おすすめ記事