![在常规文件的前 10 行中查找 10 个“main()”](https://linux22.com/image/114359/%E5%9C%A8%E5%B8%B8%E8%A7%84%E6%96%87%E4%BB%B6%E7%9A%84%E5%89%8D%2010%20%E8%A1%8C%E4%B8%AD%E6%9F%A5%E6%89%BE%2010%20%E4%B8%AA%E2%80%9Cmain()%E2%80%9D.png)
尝试编写一个命令来打印其参数,这些参数对应于前 10 行中包含文本“main()”的常规文件。
我应该怎么扫描所有文件,并查找前 10 行?
答案1
您还可以利用 GNU grep 及其 Perl 正则表达式。这将输出输入文件前 10 行中任意位置包含字符串 main() 的行。
该-z
选项允许文件被解析并被视为 grep 所操作的一个大字符串(只要它不包含 NUL 字符)。启用-P
grep 的 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