在文件和输出文件名中搜索具有特定文本的行(文件命令和grep)

时间:2013-10-08 01:05:56

标签: regex linux shell grep find

我知道这个问题可能对你们中的一些人来说很简单,但我已经尝试了几种组合并且搜索了很多内容,没有成功。

问题:我有一堆具有给定文件名的文件,但是在不同的目录中。

例如,我在目录a,b,c,d中有一个名为'THEFILE.txt'的文件。我在一个目录中,将这些作为子目录。在每个'THEFILE.txts'中,我正在寻找具有以下模式的行:'有这个属性等等等等等等等等。所以我肯定知道这条线是它以'拥有此属性'开头并以'_apple'结尾。

我试过了:

  1. 找到。 -name'THEFILE.txt'-exec grep -l'具有此属性'{} \; 这有效,但我得到的每一行都有'有这个属性'。我只想在最后使用_apple

  2. 所以我尝试过: 找 。 -name'THEFILE.txt'-exec grep -l'有这个属性* _apple'{} \; //不起作用,从我的谷歌搜索中,我不指望它。

  3. 所以,接下来我尝试了: 找 。 -name'THEFILE.txt'-exec grep -l'有这个属性[! - 〜] * _ apple'{} \; //不工作

  4. 找到。 -name'THEFILE.txt'-exec grep'具有此属性'{} \; | grep'_apple $' //输出所有匹配的行,但不输出文件名

  5. 找到。 -name'THEFILE.txt'-exec grep'具有此属性'{} \; | grep -l'_apple $' //说文件是stdin

  6. 预期输出:(假设文件a和c具有所需的行)

    ./a/THEFILE.txt
    ./c/THEFILE.txt
    

2 个答案:

答案 0 :(得分:1)

你的尝试2.几乎就在那里。稍加调整:

find . -name THEFILE.txt -exec grep -q '^Has this property.*_apple$' '{}' ';' -print

它比递归grepping和更简单(没有管道)更精确。

上述原因(与grep -l相反)的原因是-exec动作评估其命令的退出状态。 grep将以0状态(true)退出,如果它找到所查找的内容,则-exec会产生true,这反过来会导致下一个行动(-print)也将采取行动。

答案 1 :(得分:0)

如果你只想要文件名,你可以使用grep -r,然后将它管道输入awk。

grep -r "_apple$" . | awk -F: '{print $1}'