2013-10-08 40 views
0

我知道这个问题可能对你们中的一些人来说很简单,但我尝试了几种组合并且搜索了很多,没有成功。在文件和输出文件名(文件命令和grep)中搜索具有特定文本的行

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

例如,我在目录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 $' //说文件标准输入

预期输出:(比如文件和C具有所需的线)

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

回答

0

你可以只用grep -r,和如果你只想要文件名,将它管入awk。

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

+0

嗨托尼,感谢您的回复,但我需要在开头有“此属性”和结尾处有“_apple”的行。你的soln只匹配1个condn,我已经知道如何做 –

+0

所以,只需更新正则表达式以匹配你想要的:'grep -r“^拥有这个属性。* _ apple $”。| awk -F:'{print $ 1}'' – tlm

+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)也被采用。

相关问题