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
シェルは実行前に出力ファイルを生成しますgrep
。grep
コンテンツを追加する必要がある場合、ユーティリティはそのコンテンツをファイルに追加します。何も見つからない場合、grep
ファイルは空のままです。
grep
入力ファイルで一致するものが見つからない場合は、「失敗」を示すゼロ以外の終了状態で終了します。出力ファイルは削除されませんが、ファイルの削除に失敗した場合は、次のことができます。
grep 'PATTERN' infile >outfile || rm -f outfile
grep
一致しないPATTERN
場合は、削除空白がinfile
呼び出されます。厳密に言えば、失敗した場合はファイルを削除しようとします。rm -f
outfile
grep
どの理由(入力が読み取れないなど)または出力ファイルを生成できません。
一致するものがない場合でもスクリプトを終了するには:
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