Найти 10 "main ()" в первых 10 строках в обычных файлах

Пытается написать комманд, который печатает эти параметры, которые соответствуют обычным файлам, содержащим текст «main ()» в любой из его первых 10 строк.
Что я должен сканировать все файлы и искать 10 первых строк?

  • Используя «grep», чтобы найти строки, содержащие все три указанных символа в любом порядке
  • Использование grep -v по нескольким аргументам
  • Возвращая только часть строки после соответствующего шаблона (Unix)
  • REGEX и GREP - строка поиска, включая необязательные и статические слова
  • Как правильно выполнить grep на выходе ldd?
  • Как подсчитать количество экземпляров слова, начинающегося с другого слова
  • Проблема с Grege 'OR' regex
  • Элегантный способ подсчета, сколько раз шаблоны из файла встречаются в другом файле
  • 3 Solutions collect form web for “Найти 10 "main ()" в первых 10 строках в обычных файлах”

    Вы можете использовать GNU grep с его регулярными выражениями Perl. Это приведет к выводу строки, содержащей строку main () в любом месте в первых 10 строках входного файла.

    Параметр -z позволяет отделить файл и обработать его как одну большую строку (если она не содержит символов NUL), на которой будет работать grep. -P позволяет использовать режим Perl для grep, -o показывает вам соответствующую часть, -h скроет имя файла, отображаемое рядом с соответствующей строкой, и -l отобразит только имя файла.

    Если вы хотите как имя файла, так и соответствующую строку:

     grep -HPoz '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt 

    только совпадающая строка:

     grep -hPoz '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt 

    ( -h необходимо только при наличии нескольких файлов)

    только имя файла:

     grep -Pozl '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt 

    Чтобы запустить текущий каталог, но не рекурсивный: (ofc, параметры grep должны поставляться в соответствии с требованиями, как показано выше)

     find . ! -name . -prune -type f \ -exec grep -HPoz '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' {} + 

    Если вы хотите найти первые десять строк из нескольких файлов для шаблона, вы можете сделать следующее:

     for file in *; do head -n 10 "$file" | grep -F 'main()' done 

    Это напечатает соответствующие строки. Чтобы напечатать как соответствующую строку, так и имя файла, используйте:

     for file in *; do q=$(head -n 10 "$file" | grep -F 'main()') [ -z "$q" ] || printf '%s : %s\n' "$file" "$q" done 

    И для печати только имен файлов, а не соответствующей строки:

     for file in *; do head -n 10 "$file" | grep -qF 'main()' && printf '%s\n' "$file" done 

    Я бы использовал awk :

     awk 'FNR <= 10 && index($0, "main()") {print FILENAME ":", $0}' ./*.c 
    Linux и Unix - лучшая ОС в мире.