Я хотел бы найти файлы, которые начинаются с определенного шаблона, то есть первая строка файла должна содержать шаблон, а затем вывести первые 10 строк такого файла, есть ли способ сделать это?

Есть ли способ сказать grep искать только первую строку файла?

3 ответа3

2

Вам нужно будет отсканировать все файлы и получить первую строку, затем проверить шаблон и, наконец, выполнить печать первых десяти строк. Это может стать очень дорогим.

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 , чтобы уменьшить количество проверяемых файлов.

0

Надеюсь, это будет полезно.

grep -R -n "PATTERN" *.* | grep ":1:" | cut -d: -f1 | xargs head -n10

Это будет рекурсивно искать любые файлы, включая подкаталоги, и фильтровать первые строки, а затем печатать первые 10 строк для этих файлов.

0

Если есть опция awk , попробуйте это:

find . -type f -exec awk 'NR==1 && /PATTERN/ {x=1} NR>10 {exit} x' {} \;

Вы можете прочитать следующее как:

Если первая строка соответствует PATTERN, тогда установите x ; если x установлен, то вывести текущую строку (неявное действие); в любом случае выход после 10-й строки.

Технически последнее условие должно быть !x || NR>10 чтобы сохранить некоторые циклы процессора, но оригинальная версия выглядит лучше. :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .