在常规文件的前 10 行中查找 10 个“main()”

在常规文件的前 10 行中查找 10 个“main()”

尝试编写一个命令来打印其参数,这些参数对应于前 10 行中包含文本“main()”的常规文件。
我应该怎么扫描所有文件,并查找前 10 行?

答案1

您还可以利用 GNU grep 及其 Perl 正则表达式。这将输出输入文件前 10 行中任意位置包含字符串 main() 的行。

-z选项允许文件被解析并被视为 grep 所操作的一个大字符串(只要它不包含 NUL 字符)。启用-Pgrep 的 Perl 模式,-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' {} +

答案2

如果您想在多个文件的前十行中搜索某个模式,您可以执行以下操作:

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

答案3

我会用awk

awk 'FNR <= 10 && index($0, "main()") {print FILENAME ":", $0}' ./*.c

相关内容