在文件中 Grep 查找这个而不是那个?

在文件中 Grep 查找这个而不是那个?

我如何查找目录结构中包含此文本的文件

addDesignControlChangeNotification

但缺少此文本

removeDesignControlChangeNotification

谢谢!

笔记:我指的是脚本启动的目录和所有子目录。

答案1

以下是根据 Rich Homolka 的回答,但适用于目录树:

find . -type f  -exec grep -l addDesignControlChangeNotification {} \; | 
 while IFS= read -r file; do 
   grep -q removeDesignControlChangeNotification "$file" > /dev/null ; 
   [ $? -ne 0 ] && echo $file; 
 done

返回的任何文件都将包含addDesignControlChangeNotification但不包含removeDesignControlChangeNotification

解释:

  • find . -type f -exec grep -l foo {} \;:这将打印当前目录下包含字符串的任何子目录中的所有文件foo。该-l标志使 grep 仅打印匹配文件的名称。

  • while read file:这将遍历上面找到的每个文件,并将其名称保存在变量中$file

  • grep -q bar "$file" > /dev/nullbar:此命令在每个包含的文件中查找字符串foo

  • [ $? -ne 0 ] && echo $file;$?:如果命令的返回值( )grep为 0(即,如果字符串不在文件中),则打印文件的名称。

答案2

这应该有效:

FIRST=addDesignControlChangeNotification
SECOND=removeDesignControlChangeNotification
grep -l $FIRST * | while IFS= read -r FILE
do
    grep $SECOND "$FILE" &> /dev/null
    if [ $? -ne 0 ]
    then
        echo "File $FILE has $FIRST but not $SECOND"
    fi
done

答案3

一句话:

comm -2 -3 <(grep -rl addDesignControlChangeNotification     . | sort ) \
           <(grep -rl removeDesignControlChangeNotification  . | sort )

grep -r是递归 grep,<()流程替代,并comm显示一对(已排序)文件有/没有共同点的行。在本例中,我们只想要第 1 列的输出:第一个文件中的行(其中“文件”实际上是 grep 输出),而第二个文件中没有。

相关内容