用于查找带有word1&的文件的Shell脚本没有word2

时间:2018-05-13 19:22:13

标签: bash shell grep find

我尝试编写一个shell脚本,找到所有带有word1但没有word2

的文件

脚本

echo -e "File name:"
read file
list=$(find "." -type f -name "$file")
co=$(cat $list | wc -l)
if [ $co -eq 0 ]
then
  echo "File not found"
else
  echo "File(s) List"
  echo "$list"
  result=$(grep -v "word2" $list| grep -rHn "word1" $list)
  if [ $? -ne 0 ]
  then
    echo "Word not found"
  else
    echo "File Line Word"
    echo "$result"
  fi
fi

File1中:

word2@word1

文件2:

test@word1

有了这个grep,我得到了两个文件但我只想File2没有word2

3 个答案:

答案 0 :(得分:1)

你的"结果="有两个错误。行:

  • 第二个grep应读取标准输入(管道的输出)而不是$ list

  • 它不应该是递归的

所以,我建议:

result=$(grep -v "word2" $list| grep -Hn "word1" )

答案 1 :(得分:0)

您的脚本基于没有空格或换行符的文件名 您的脚本在result=$(grep -v "word2" $list| grep -rHn "word1" $list)中出错了。第二个grep不会查看第一个grep的结果,因为它有$list作为参数。
你想要

  result=$(grep -rHn "word1" $(grep -lv "word2" $list))

这仍然失败,第二个grep将返回至少有一行不是“word2”的所有文件。
首先,您需要找到要排除的所有文件,这些文件是“word2”。这些文件需要从$ {list}中排除(我使用大括号,习惯了)。

   grep -vf <(grep -l "word2" ${list}) <(echo ${list} | tr " " "\n" )

导致

result=$(grep -Hn "word1" 
  $(grep -vf <(grep -l "word2" ${list}) <(echo ${list} | tr " " "\n" )))

另一种方法是在你的find命令中添加额外的参数(找不到word2但找到word1)

find  "." -type f -name "${file}" ! -exec grep -q "word2" {} \; \
   -exec grep -Hn "word1" {} \; 2>/dev/null

答案 2 :(得分:0)

这可能是效率最高的grep方法:

grep -lv word2 $(grep -l word1 File*)

输出:

File2

请注意,-l开关在第一场比赛时停止,对于大型文件可以节省时间。

要使用find,同时避免不必要的变量,请执行以下操作:

grep -lv word2 $(grep -l word1 $(find . -type f -name "$file") )