Grep 前 50 行文件的模式

Grep 前 50 行文件的模式

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

我可以编写一个Python脚本迭代每个文件的前几行,但根据经验,Python 虽然功能强大,但速度很慢。我有超过 200 个 *.sql 文件需要检查,我想学习一个我将来可以推广的解决方案。

答案1

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

awk 'FNR > 50 { nextfile }; /foobar/ { print FILENAME ": " $0 }' ./*.sql

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

如果你awk没有nextfile这个变体也可以工作,尽管我认为它的效率会较低:

awk 'FNR <= 50 && /foobar/ { print FILENAME ": " $0 }' ./*.sql

答案2

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

$ for I in *.sql ; do echo $I && head -n 50 $I | grep foobar ; done

答案3

GNU 也可以以循环方式sed执行任务:

for f in *.sql
do
    sed -e '1 F' -e '51 Q' -e '/pattern/! d' "$f"
done

答案4

通过管道输入 grep 即可到达一半。

head -50 filename | grep string

相关内容