我尝试编写一个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
答案 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") )