Unix grep 查找以 [pattern] 开头的文件

Unix grep 查找以 [pattern] 开头的文件

我想找到以特定模式开头的文件,即文件的第一行应包含该模式,然后打印该文件的前 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 行。

相关内容