我想找到以特定模式开头的文件,即文件的第一行应包含该模式,然后打印该文件的前 10 行,有没有办法做到这一点?
有没有办法告诉 grep 只搜索文件的第一行?
答案1
您需要扫描全部文件并获取第一行,然后检查模式,最后执行前十行的打印。这可能会非常昂贵。
find /path/to/search \
-type f \
-exec /bin/bash -c "head -n 1 '{}' | grep 'PATTERN' >/dev/null" \; \
-exec head -n 10 \{\} \;
要求-type f
不在head
目录上运行,并且grep
被重定向,因为我们只对其退出状态感兴趣。第二个-exec
将仅在通过第一个测试的文件上运行。
建议您在之前添加额外的测试-type f
,以减少需要扫描的文件数量。
答案2
如果awk
可以选择的话,请尝试以下操作:
find . -type f -exec awk 'NR==1 && /PATTERN/ {x=1} NR>10 {exit} x' {} \;
您可以阅读以下内容:
如果第一行与 PATTERN 匹配,则设置
x
;如果x
设置,则打印当前行(隐式操作);无论哪种情况,都在第 10 行后退出。
从技术上讲,最后一个条件应该是!x || NR>10
节省一些 CPU 周期,但原始版本看起来更好。:)
答案3
希望这会有用。
grep -R -n "PATTERN" *.* | grep ":1:" | cut -d: -f1 | xargs head -n10
这将递归搜索任何文件(包括子目录)并过滤前行,然后打印这些文件的前 10 行。