Grep 模式的前 50 行文件

dot*_*hen 5 grep

如何在目录中的前 50 行文件中搜索给定字符串?我特别在寻找哪个数据库表文件(来自 mysqldump)定义了一个特定的字段,但我不想 grep 整个文件,在 20-40 行 CREATE TABLE 之后继续到数百个 INSERT 语句。

我可以编写一个 Python 脚本来迭代每个文件的前几行,但是从经验来看,Python 虽然功能强大,但速度很慢。我有超过 200 个 *.sql 文件要处理,我想学习一个解决方案,无论如何我都可以在将来推广它。

Ste*_*itt 10

awk(假设您的实现支持该nextfile语句)可以很好地做到这一点:

awk 'FNR > 50 { nextfile }; /foobar/ { print FILENAME ": " $0 }' ./*.sql
Run Code Online (Sandbox Code Playgroud)

一旦处理了 50 条记录,第一条语句就会跳到下一个文件。第二个语句打印文件名和包含foobar.

如果您awk没有nextfile此变体也可以使用,尽管我认为它的效率会降低:

awk 'FNR <= 50 && /foobar/ { print FILENAME ": " $0 }' ./*.sql
Run Code Online (Sandbox Code Playgroud)

  • @JID,例如在`touch ORS=foo.sql` 之后尝试 (2认同)

dot*_*hen 6

这个解决方案有效,但我觉得它很笨拙。在前 50 行中搜索字符串“foobar”:

$ for I in *.sql ; do echo $I && head -n 50 $I | grep foobar ; done
Run Code Online (Sandbox Code Playgroud)

  • @ArturGaspar - 如果您点击页面顶部的 [votes](http://unix.stackexchange.com/questions?sort=votes),您将在前十个问题之一中找到答案。 (2认同)