grep을 사용하여 파일에서 문자열을 찾으면서 해당 파일의 첫 번째 줄만 검색하려면 어떻게 해야 합니까?
답변1
두 가지 옵션이 더 있습니다:
그리고awk
awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*
또는 귀하의 awk
버전이 이를 지원하지 않는 경우 nextfile
(제안해 주신 Stéphane Chazelas에게 감사드립니다):
awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*
다음 파일로 전환하기 전에 첫 번째 줄만 읽고 일치하는 경우에만 인쇄됩니다 "pattern"
.
장점은 필드를 미세 조정하여 패턴(예: $2
두 번째 필드에서만 검색) 및 출력(예: $3
세 번째 필드 인쇄 또는 FILENAME
혼합 인쇄)을 검색할 수 있다는 것입니다.
("현재 입력 레코드 번호", 즉 줄 번호) 버전을 사용하면 FNR
grep하는 줄을 더 세밀하게 조정할 수 있습니다. FNR==3
세 번째 줄은 10, FNR<10
첫 번째 줄은 10 등입니다. (이 경우 매우 큰 파일을 다루고 있고 버전에서 이를 지원하는 경우 성능 향상을 위해 awk
혼합하는 것이 좋을 수 있습니다 .)FNR
nextfile
사용 head
, 파일 이름 유지
head -n1 -v mydir/files*|grep -B1 pattern
-v
옵션은 head
파일 이름을 인쇄하고, 옵션은 일치하는 줄 앞의 줄, 즉 파일 이름을 인쇄 -B1
합니다 . grep
파일 이름만 필요한 경우 다음으로 추가로 파이프할 수 있습니다 grep
.
head -n1 -v mydir/*|grep -B1 pattern|grep ==>
don_crissti가 댓글에서 알아차린 것처럼 패턴 자체와 일치하는 파일 이름을 기록해 두세요. 하지만...
답변2
GNU 사용 grep
:
grep -m1 ^ * |grep 'pattern'
재귀적으로:
grep -rm1 ^ . |grep 'pattern'
답변3
@Rob의 의견을 구현하고 예상한 결과를 성공적으로 얻었습니다.
string
문자열로 바꾸십시오 .
grep -Rin "string" . | grep ":1:.*string" > result.txt
현재 디렉터리에서 대소문자를 구분하지 않는 재귀 검색을 수행 string
하고 줄 번호를 인쇄합니다. 그런 다음 파일의 1행에서 일치하는 항목을 검색하고 출력을 result.txt
.
답변4
sed 명령을 사용해 볼 수도 있습니다.
sed -n '1p' filename| sed -n '/pattern/p'