【问题标题】:Search for lines with specific text in files and output file names (file command and grep)在文件中搜索具有特定文本的行并输出文件名(文件命令和 grep)
【发布时间】:2013-10-14 18:26:49
【问题描述】:

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

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

例如,我在目录 a、b、c、d 中有一个名为“THEFILE.txt”的文件。我在一个将这些作为子目录的目录中。在每个 'THEFILE.txts' 中,我都在寻找具有以下模式的行:'Has this property blah blah blah _apple'。所以我对这条线的确定是它以'Has this property'开头并以'_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$' //说文件是标准输入

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

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

【问题讨论】:

    标签: regex linux shell grep find


    【解决方案1】:

    如果你只想要文件名,你可以只使用 grep -r 并将其通过管道传输到 awk 中。

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

    【讨论】:

    • 嗨,托尼,感谢您的回复,但我需要开头带有“具有此属性”和结尾的“_apple”的行。你的soln只匹配1个condn,我已经知道该怎么做了
    • 所以只需更新正则表达式以匹配您想要的:grep -r "^Has this property.*_apple$" . | awk -F: '{print $1}'
    • 谢谢,这完全解决了我的问题。我真的需要学习更好地使用正则表达式。
    【解决方案2】:

    您的尝试 2. 几乎完成了。稍作调整:

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

    它比递归 grepping 更精确,更简单(无管道)。

    上述工作(与grep -l 相对)的原因是-exec 操作评估其命令的退出状态是什么。 grep 会以 0 状态退出(即true),如果它找到它所寻找的,这将使-exec 产生true,这反过来将导致下一个操作(-print)成为也拍了。

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 2010-10-03
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2020-12-08
      • 1970-01-01
      相关资源
      最近更新 更多