2016-07-22 3 views
0

私はUnixを初めて使い、以下の要件を満たしています。unixの別のファイルにも存在するファイル内の文字列を検索します。

file1.datには、次のようなデータがあります。

case1.txt 
case2.txt 
case3.txt 
case4.txt 
case5.txt 

File1.datのは、私がFile1.datのでcase1.txt、case2.txt、case3.txtで

​​

データを言及したファイルの上にあるフォルダを持っているだけで、ファイル名

を持っています:

step1 
step2 
step3 
step4 

ここで、file1.datにも存在する各ファイルからstep2という特定のステップを実行する必要があります

注:step2は常に行番号2ではありません。

答えて

0

これを試してみてください:

while read f; do 
    [ -f "$f" ] && sed -n '/step2/p' "$f" 
done < file1.dat 

それが出力されますfile.datに記載されている各ファイルにstep2に一致する行(複数可)。 (ファイル名を含む)file1.dat

+0

はどうもありがとうございました。.. – user180946

+0

しかし、出力にも一致するファイルがないことを示しています...エラー: 'sed:ファイルcase5.txtを開くことができません '、case5.txtはfile1.datに存在しますが、./all_filesフォルダには存在しません。助けてください – user180946

+0

sedコマンドを適用する前に、ファイルが存在するかどうかをチェックするように更新しました。 – SLePort

0
while read f; do 
    test -f "$f" && grep -F 'step2' "$f" 
done <file1.dat 

線はf変数に一つずつ読み出されます。

ファイル$fは、指定したファイル内のテキスト文字列step2を探すためにgrepを使用する前に存在していることを確認するためにwhile - ループテストのボディ。少し冗長(同等の)

Aループのバージョン:

while read f; do 
    if [ -f "$f" ]; then 
     grep -F 'step2' "$f" 
    fi 
done <file1.dat 

あなたがこれを実行する場所に応じて、あなたは少しgrepコマンドを変更する必要がある場合があります。あなただけのすべてのファイルとサブフォルダ上のフォルダでこれを実行する場合、例えば:

grep -F 'step2' "all_files/$f" 

ニーズがあることかどうかは問題では完全には明らかに、しかし、簡単に調整できませんでした。もちろん

、あなただけの完全file1.datをバイパスし、全くループなし

grep -F 'step2' all_files/case?.txt 

を言うことができます。

編集:新しい要件に:

find ./all_files -type f -name "case?.txt" -print0 | 
xargs -0 grep -l -F 'step2' 

これは再帰的に、all_filesフォルダの下にあるすべてのフォルダを検索case?.txtに一致するファイルを検索し、希望の文字列が含まれているものを報告します。

パターンをより厳密に、おそらくcase[1-5].txtのように変更したい場合があります。

+0

ありがとう..コマンドが再帰的に動作する場合は助けてください。./all_files/のサブフォルダとファイル名に 'case1.txt:step2'、' case2.txt:step2'も表示してください – user180946

+0

これで解決方法は完全に変更されましたが、それを私の答えに追加します。 – Kusalananda

+0

ありがとう..しかし、私はコマンドを実行したときにエラー出力を得ました。 '#find ./all_files -type f -name" * .txt "-print0 | xargs -0 grep -l -F 'step2'' 'find:悪いオプション-print0' ' find:[-H | xargs:[-t] [-e] [-e [eofstr]] [-E eofstr] [-E eofstr] [-E] [-l [#]] [-n#[-x]] [-s size] [cmd [args ...]] ' – user180946

0

./all_filesディレクトリの各ファイルからstep 2を取得する場合は、エクササイズとして使用する必要がない限り、files.datは不要です。お使いのシェルがブレース展開サポートしている場合:

grep "step2" all_files/case{1,5}.txt 

またはfiles.datを使用して、あなたはall_filesディレクトリに移動しgrepへの入力などのコンテンツをリダイレクトすることができます:

cd all_files 
grep "step2" $(<../files.dat) 
関連する問題