특정 패턴이 포함된 파일을 찾는 방법특정 줄 번호에? 3줄의 텍스트 파일이 포함된 디렉터리가 있다고 가정해 보겠습니다. 예를 들면 다음과 같습니다.
Title A
Category X
Description Y
Category X
모든 온라인 파일을 grep/필터링하는 방법은 무엇입니까 2
? Title A
as 줄이 포함된 파일을 어떻게 찾을 수 있나요 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 기능).
-P
Perl 스타일 정규 표현식(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 $.;
};
'