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 命令是第一步,然后在第二步中我将对newn.txt.因此,如果 grep 找不到该单词,或者创建了一个空文件,我希望脚本停止而不执行第二步。有没有办法做到这一点?

答案1

shell 甚至会在运行之前创建输出文件grepgrep如果需要添加任何内容,该实用程序会将内容添加到文件中。如果grep没有找到任何内容,该文件将保留为空。

grep如果在输入文件中找不到任何匹配的内容,则发生的另一件事是它将以非零退出状态退出,表示“失败”。这不会删除输出文件,但您可以在删除文件失败时采取如下操作:

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

如果grep无法匹配PATTERNin 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"找到第一个“最小值”后立即存在
  • 第二个grep执行真正的工作,如果第一个失败则不会执行
  • "${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

相关内容