![Grep 前 50 行文件的模式](https://linux22.com/image/63547/Grep%20%E5%89%8D%2050%20%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%E6%A8%A1%E5%BC%8F.png)
一个人怎么可能在目录中的前 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