【问题标题】:From UNIX shell, how to find all files containing a specific string, then print the 4th line of each file?从 UNIX shell 中,如何查找包含特定字符串的所有文件,然后打印每个文件的第 4 行?
【发布时间】:2014-08-18 16:31:52
【问题描述】:

我想查找当前目录中包含给定字符串的所有文件,然后只打印每个文件的第 4 行。

【问题讨论】:

  • 您尝试了哪些方法,又是如何失败的?但基本上grep -Frl string . | xargs -n 1 sed -n 4p
  • 我试过了:grep 'mystring' * -r | sed -n 4p谢谢你的工作完美而快速。

标签: shell unix command-line sed grep


【解决方案1】:
grep --null -l "$yourstring" * | # List all the files containing your string
  xargs -0 sed -n '4p;q' # Print the fourth line of said files.

不同版本的 grep 的 --null 咒语略有不同,但它通常以某种形式存在。有关详细信息,请阅读您的手册页。

更新:我相信 grep 的空文件列表咒语之一是一个合理的解决方案,它将涵盖绝大多数现实世界的用例,但要完全可移植,如果您的 grep 版本不支持任何null 输出它与xargs 一起使用并不完全安全,因此您必须求助于find

find . -maxdepth 1 -type f -exec grep -q "$yourstring" {} \; -exec sed -n '4p;q' {} +

因为find 参数几乎都可以用作谓词,所以-exec grep -q… 部分将最终馈送到sed 的文件过滤到仅包含所需字符串的文件。

【讨论】:

  • +1 但请注意,这个空的东西是 GNU 扩展而不是完全可移植的。
  • @tripleee 它不是只是 GNU 扩展。它也存在于 BSD grep 中。这并不是说它是完全标准的,但正如我在回答中所说,它通常以某种形式存在。我将使用更便携的解决方案更新我的答案。
【解决方案2】:

试试下面的 GNU find 命令,

find . -maxdepth 1 -type f -exec grep -l 'yourstring' {} \; | xargs -I {} awk 'NR==4{print; exit}' {}

查找当前目录中包含特定字符串的所有文件,并打印每个文件中存在的第 4 行。

【讨论】:

  • 这将递归到当前目录以外的地方。
  • 这一次在我身上
  • 你可以写这个find … -exec grep -q 'yourstring' {} \; -exec awk 'NR==4' {} +awk 'NR==4{print;exit;}' 也会在打印第四行后让 awk 退出。
  • @kojiro 感谢您的留言。但是没有 grep l,我怎样才能得到文件名。
  • @AvinashRaj -exec 结果也可以用作find 中的谓词。由于grep -q 将在一行匹配时返回基本上“true”或“false”,所以 next -exec 语句将根据grep 的结果执行或不执行。 find 将提供适用的文件名。
【解决方案3】:

这个 for 循环应该可以工作:

while read -d '' -r file; do
    echo -n "$file: "
    sed '4q;d' "$file"
done < <(grep --null -l "some-text" *.txt)

【讨论】:

  • 如果某些文件的名称中有换行符怎么办?
【解决方案4】:

来自其他用户:

grep -Frl string . | xargs -n 1 sed -n 4p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2023-04-03
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多