grepは必要な単語を取得できませんが、Linuxは次のタスクに進みます。どうやって防ぐことができますか?

grepは必要な単語を取得できませんが、Linuxは次のタスクに進みます。どうやって防ぐことができますか?

txtファイルが多いです。これには、「最小」(各ファイルに一度だけ表示される)という単語が含まれており、その単語を含む行を取得してその行を新しいファイルに表示したいと思います。
これを行うには、次のコマンドを使用します。

grep 'Minimum' file1.txt > new1.txt     

私はすべてのファイル(file1、file2など)に対してこれを行い、多くのものを得ましたnewn.txt。しかし、一部のファイルには「最小」という単語がないため、空であることがわかりましたnewn.txt。それでは、grepが単語を取得できない場合、Linuxはなぜエラーメッセージを表示しませんか?引き続きnewn.txtを生成するのはなぜですか?空のファイルを提供することは本当に迷惑です。それでは、単語が見つからない場合に
単語の生成を防ぐ方法はありますか?newn.txt

また、これをbashスクリプトに入れるつもりです。 grepコマンドは最初のステップで、2番目のステップではnewn.txt単語をgrepするため、grepが単語を見つけられないか空のファイルを作成します。 、手順2を実行せずにスクリプトを停止したいと思います。これを行う方法はありますか?

答え1

シェルは実行前に出力ファイルを生成しますgrepgrepコンテンツを追加する必要がある場合、ユーティリティはそのコンテンツをファイルに追加します。何も見つからない場合、grepファイルは空のままです。

grep入力ファイルで一致するものが見つからない場合は、「失敗」を示すゼロ以外の終了状態で終了します。出力ファイルは削除されませんが、ファイルの削除に失敗した場合は、次のことができます。

grep 'PATTERN' infile >outfile || rm -f outfile

grep一致しないPATTERN場合は、削除空白がinfile呼び出されます。厳密に言えば、失敗した場合はファイルを削除しようとします。rm -foutfilegrepどの理由(入力が読み取れないなど)または出力ファイルを生成できません。

一致するものがない場合でもスクリプトを終了するには:

if ! grep 'PATTERN' infile >outfile; then
    rm -f outfile
    exit
fi

答え2

このループを試してみてください。ニーズに合わせて調整してください。

i=0
for file in *; do
    line=""
    line="$(grep -hm1 'Minimum' "${file}")"
    [ -z "$line" ] || echo "$line" > new"${i}".txt
    ((i++))
done

*この行をfor file in *; doファイルセットに変更してください。

表示される可能性のある望ましくない grep 出力を注意深く取り除いてください。

答え3

for i in file*; do grep -q Minimum "$i" && grep Minimum "$i" > "${i/file/new}"; done
  • grep -q Minimum "$i"最初の「最小値」が見つかった直後に存在します。
  • 2つ目はgrep実際の操作を行い、1つ目が失敗した場合は実行されません。
  • "${i/file/new}"file各ファイル名を次のように変更します。new

答え4

Linuxコマンドの実行時にスクリプトの実行を停止する最も簡単な方法失敗する追加して

set -e

ファイルの先頭に。これにより、失敗したコマンドに対してスクリプトが停止します。一致するものがない場合は、grep失敗信号を送信します。たとえば、

echo "starting"
echo "someword" > ex1.txt
cat ex1.txt | grep "otherword"
echo "continuing"

印刷してみてください

starting
continuing

しかし、

set -e
echo "starting"
echo "someword" > ex1.txt
cat ex1.txt | grep "otherword"
echo "continuing"

印刷してみてください

starting

関連情報