재귀 grep은 특정 줄 번호만 일치합니다.

재귀 grep은 특정 줄 번호만 일치합니다.

특정 패턴이 포함된 파일을 찾는 방법특정 줄 번호에? 3줄의 텍스트 파일이 포함된 디렉터리가 있다고 가정해 보겠습니다. 예를 들면 다음과 같습니다.

Title A
Category X
Description Y

Category X모든 온라인 파일을 grep/필터링하는 방법은 무엇입니까 2? Title Aas 줄이 포함된 파일을 어떻게 찾을 수 있나요 1?

grep 매뉴얼 페이지, ripgrep 및 대안을 살펴봤지만 패턴 검색을 특정 줄 번호로 제한하는 것이 가능한지 잘 모르겠습니다.

답변1

다음과 같이 사용할 수 있습니다 awk.

awk 'FNR == 2 && /Category X/ {print FILENAME}' *

답변2

with를 사용하면 find번째 줄에서 패턴을 찾을 때awk 파일의 나머지 부분 처리를 중단하거나 두 번째 줄 에서 패턴을 찾을 수 없을 때 종료할 수 있습니다.

find -type f -name 'xyz*.txt' -exec \
    awk 'NR==2{ if(/pattern/) print FILENANE; exit }' {} \;

답변3

grep재미로:

PAT="Category X"
LN=2
> grep -n "$PAT" file* | grep ":$LN:$PAT$" | grep -o "^[^:]*"
file1
file2

답변4

사용 사례에 GNU grep을 사용할 수 있습니다.

$ grep -Plzr '^(?:.*\n){1}.*Category X' .

grep일반적으로 줄 단위로 작동하지만 GNU grep은 -z텍스트 파일에서 찾을 수 없는 문자( ) \0로 레코드를 구분하기 때문에 전체 파일을 한 줄로 처리하는 옵션을 추가합니다.

이제 전체 파일에 정규식을 적용할 수 있습니다. 귀하의 요구 사항은 두 번째 행만 검색하는 것이므로 아무 것도 하지 않고 한 행을 지나서 항해합니다.^(?:.*\n){1}

캐럿 ^은 정규식을 시작 부분에 고정합니다. 포인트는 개행 문자와 일치하지 않으므로 한 줄에 걸쳐 있을 수 없습니다.

그런 다음 검색은 .*Category X다음 줄, 즉 두 번째 줄에서 시작되지만 줄을 가로질러 이동하지는 않으므로 두 번째 줄에서 패턴이 발견되면 일치하게 됩니다.

일치하는 항목이 있는 경우 이 -l옵션은 파일 이름을 STDOUT에 나열합니다.

-r옵션을 사용하면 grep이 재귀적으로 실행됩니다(GNU 기능).

-PPerl 스타일 정규 표현식(GNU 기능)을 작성할 수 있습니다 .


GNU find+sed 조합을 사용하여 문제를 해결하는 또 다른 방법은 다음과 같습니다.

$ find . -type f -exec sed -ns '2{/Category X/F;}' {} +

GNU find + GNU xargs 동일한 작업을 수행하려면 Perl을 입력하십시오.

find . -type f ! -size 0 -print0 |
xargs -r0 perl -lne '
  (eof||$.==2)&&do{
    print $ARGV if $.==2 && /Category X/;
    close  ARGV; undef $.;
  };
'

관련 정보