일반 파일의 처음 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

여러 파일의 처음 10줄에서 특정 패턴을 검색하려면 다음을 수행할 수 있습니다.

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

관련 정보