1行ずつ読み、grepを使用してcatを実行します。

1行ずつ読み、grepを使用してcatを実行します。

ファイルの内容からロードし、他のファイルで cat と grep を使用するスクリプトを作成しています。問題は、grepを実行しても値が表示されないことです。コマンドを手動で実行すると、データが取得されます。

私は中を使用しましたが、問題は同じです。 output6.txt は常に空です。 echoが動作しているようで、grepまたはcatの問題のようです。

BlockspamCLIs.txt の例 次の値があります。

4412345 
441236 
2367890

All_events.csv ファイルの例

1,441236,20220909120909,test
2,441237,20220909120909,test
3,441232,20220909120909,test
4,44136,20220909120909,test
5,2367890,20220909120909,test

出力として数値を含むCSVファイルを検索、保存、記録したいです。たとえば、次のようになります。

1,441236,20220909120909,test
5,2367890,20220909120909,test

私のスクリプト:

for i in `cat BlockspamCLIs.txt`
do
   grep $i *_All_events.csv >> output6.txt
   
   echo $i
done

よろしくお願いします。

ベストアンサー1

まず、これらのタスクを実行するためにシェルスクリプトを使用しないでください、遅く、エラーが発生しやすいです。とにかく、grep必要なものをすでに実行することが可能です。

grep -f BlockspamCLIs.txt *_All_events.csv >> output6.txt

からman grep

       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.   If  this  option  is
              used  multiple  times  or  is  combined  with the -e (--regexp)
              option, search for all patterns given.  The empty file contains
              zero patterns, and therefore matches nothing.

次に、シェルループを使用してファイルの内容を繰り返す場合、絶対にこれをしないでください。for i in $(cat file)。また、さまざまな問題を回避するために常に変数を引用する必要があります。たとえば、 の行にBlockspamCLIs.txtスペースが含まれていると、コマンドは機能しません。

つまり、行にスペースやシェルワイルドカードがない場合は、表示されるコマンドが機能します。次のように書くことをお勧めします。

while IFS= read -r i; do
    grep -e "$i" -- *_All_events.csv >> output6.txt
    printf '%s\n' "$i"
done < BlockspamCLIs.txt

おすすめ記事