即使文件不存在,如何执行 grep 操作?

即使文件不存在,如何执行 grep 操作?

我在我的代码中做了类似的事情

file_nm=`ls -latr *abc*`
if [ `grep "search_txt" "$file_nm" | wc -l` -gt 0 ]
then
  echo "string found"
else
  echo "string not found"
fi

如果file_nm解析为空白,则我的代码将挂起,因为grep预期该file_nm为空白。我怎样才能使这段代码工作?grep如果文件不存在,是否有任何选项可以绕过该命令?

答案1

尝试:

grep "search_txt" /dev/null "$file_nm"

即使不存在,喂入也会使它工作,因为/dev/null总是至少有一个文件 - 这是- 可以处理。grep$file_nmgrep/dev/null

答案2

您可以显着简化这一点(并避免令人讨厌的问题解析 ls 所固有的)通过执行以下操作:

file_nm=$(find . -maxdepth 1 -name "*abc*");
[ -e "$file_nm" ] && grep -q "search_txt" "$file_nm" &&
      echo "string found" ||
      echo "string not found"

但是,就像您最初的示例一样,如果您有多个文件匹配*abc*.所以,我会用这个:

for i in *abc*; do 
    grep -q "search_txt" "$i" && 
        echo "string found in $i" || 
        echo "string not found in $i"
done 

如果您不关心多个文件中的匹配,而只想知道匹配的任何文件是否*abc*包含该字符串search_txt,您可以简单地执行以下操作

grep -q "search_txt" *abc* &&  echo "string found" || echo "string not found"

答案3

有几个问题,包括:

  • 您发布的代码没有挂起
  • 您使用-l标志 to ls,这意味着您将查找名为-rw-r--r--等的文件
  • ls您应该完全避免解析输出

并且不需要测试 的输出grep,您只需使用退出状态即可。从man grep

 EXIT STATUS
       The exit status is 0 if selected lines are found, and 1 if not found.

这是一个执行相同操作的简化版本:

if grep -q "search_txt" *abc*
then
  echo "string found"
else
  echo "string not found"
fi

答案4

你应该测试是否$file_nm为空在运行 grep 之前

if [ -n "$file_nn" ];

如果 $file_nm 不为空,将返回 True。

相关内容