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

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

  • Объединение столбцов в 2 файла и печать значений, которые различаются
  • Результаты кошки grep
  • Как проверить, присутствует ли какой-либо IP-адрес в файле с использованием сценариев оболочки?
  • zgrep -h не работает, zgrep --no-filename делает?
  • Греп на одной линии
  • Разделить аналогичные строки
  • Как получить несколько строк из файла с помощью регулярных выражений?
  • Сценарий оболочки для фильтрации даты отдельно от конкретного столбца файла .csv и сохранения вывода в другом файле csv
  • 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 - лучшая ОС в мире.