0

親ディレクトリの下のすべてのディレクトリの検索に費やす時間を最小限に抑え、いくつかのファイル内のいくつかのものをgrepする簡単なシェルスクリプトを作成しています。これが私のスクリプトです。

#!/bin/sh
MainDir=/var/opt/database/1227-1239/

cd "$MainDir"

for dir in $(ls); do

grep -i "STAGE,te_start_seq Starting" "$dir"/his_file | tail -1 >> /home/xtee/sst-logs.out

if [ -f "$dir"/sysconfig.out];
then
    grep -A 1 "Drive Model" "$dir"/sysconfig.out | tail -1 >> /home/xtee/sst-logs.out
else
    grep -m 1 "Physical memory size" "$dir"/node0/setupsys.out | tail -1 >> /home/xtee/sst-logs.out
fi

done

STAGE,te_start_seq Startingスクリプトは、ファイルの下の文字列をgrepしてからhis_fileダンプすることsst-logs.outになっています。私の問題は、ifステートメントの一部です。スクリプトは、現在のディレクトリで をチェックし、存在する場合はsysconfig.outgrepしてdrive modelダンプします。sst-logs.out存在しない場合は、ディレクトリを に変更してからnode0grepphysical memory sizeからsetupsys.outにダンプしsst-logs.outます。私の問題は、if then elseデータをまったくダンプしないため、ステートメントが機能していないように見えることですが、手動で grep を実行すると、データがあります。

シェル スクリプトの何が問題になっていますか? これを行うためのより効率的な方法はありますか?

4

3 に答える 3

2

まず、「ディレクトリをnode0に変更してからgrep」と言った場合、ここでディレクトリを変更しているのではなく、別のパスを使用しているだけです。本当にディレクトリを変更しますか? 「$dir/node0/」ですか、それともディレクトリ「$dir」外ですか?

次に、/var/opt/database/1227-1239/ にスペースを含むファイルがありますか? ls の出力を表示できますか?

$(ls); の 'for dir は使用しません。行う'

ls を解析しようとすると、多くの落とし穴に遭遇し始めます。

for dir in * ; do 
 if [[ -d "$dir" ]] ; then
  grep -i "STAGE,te_start_seq Starting" "$dir"/his_file | tail -1 >> /home/xtee/sst-logs.out
  if [ -f "$dir"/sysconfig.out]; then
   grep -A 1 "Drive Model" "$dir"/sysconfig.out | tail -1 >> /home/xtee/sst-logs.out
  else
   grep -m 1 "Physical memory size" "$dir"/node0/setupsys.out | tail -1 >> /home/xtee/sst-logs.out
  fi
 if
done

取得した場合は find -maxdepth を使用することもできます。それ以外の場合は .. -prune -o .. になります。

私の唯一の推測では、 $(ls) には不適切な文字またはスペースを含むファイルがいくつかあるため、これらの文字をエスケープしているため、ファイルを手動で処理するとすべてが機能しますか?

于 2012-09-28T03:25:57.007 に答える
0

こんなもの使ってみませんか

find . -name "*" -print | xargs grep -i <text>

text現在のディレクトリの下にあるすべてのファイルを検索するには

于 2012-09-28T03:09:37.553 に答える
0

grep の再帰オプションについて聞いたことがありますか?

grep <text> -R .
于 2012-09-28T03:18:17.253 に答える