나는 그것을 안다
grep -rhI "# Active" > out.txt
검색된 디렉토리 내에 포함된 모든 행을 출력 # Active
하지만 전체 .txt 파일 내용을 원하므로 예를 들어 보겠습니다.
예시.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
따라서 grep을 수행하면 이 .txt 파일에 포함된 줄뿐만 아니라 다른 모든 줄도 # Active
출력하기를 원합니다 . 예를 들면 다음과 같습니다.# Active
출력.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
답변1
GNU가 아닌 버전의 가 없을 grep
가능성이 높 -z
거나 이식성이 필요한 경우...
grep -q pattern file && cat file
-q
출력을 억제하지만 일반적으로 패턴 일치가 발견되었는지 여부에 따라 종료 상태가 설정됩니다. 패턴 일치를 사용하면 다음과 동일한 grep
성공 코드가 반환됩니다 .0
진실그러면 cat
명령이 실행될 수 있습니다.
답변2
일반적으로 grep은 일치하는 줄을 표시합니다.
$ grep -rhI "# Active"
Line3 # Active
전체 파일을 보려면 다음 -z
플래그를 추가하세요.
$ grep -rhIz "# Active"
Line1
Line2
Line3 # Active
Line4
Line5
etc
-z
grep에게 줄 바꿈을 '줄' 구분 기호로 사용하지 않고 대신 NUL 문자를 사용하도록 지시하는 GNU 확장입니다. 텍스트 파일에는 일반적으로 NUL 문자가 없기 때문에 grep에게 전체 파일을 단일 '라인'인 것처럼 읽도록 지시하는 효과가 있습니다. 따라서 일치하는 항목이 있으면 전체 파일이 인쇄됩니다.
BSD/OSX 버전의 grep에서는 NUL 입력 옵션을 사용할 수 없으며 -z
다른 의미를 갖습니다.
다른 grep 옵션
-r
grep에게 파일과 디렉토리를 재귀적으로 검색하도록 지시합니다.
-I
grep에게 바이너리 파일을 무시하라고 지시합니다.
-h
파일 이름을 첨부하지 않고 일치 항목을 인쇄하도록 grep에 지시합니다.
답변3
sed
대안:
sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile
이 스크립트는 더 이상 입력이 없을 때까지 버퍼를 변경하고 실행 (예: 인쇄 및 다음 라인 가져오기) h
하는 지점에서 일치하는 라인을 만날 때까지 이전 버퍼에 라인을 축적하고 삭제하는 방식으로 작동합니다.x
n
답변4
여러 파일에 대해 이 작업을 수행하려면 다음을 수행하십시오.
cat `grep -rIl "# Active" *`
Grep은 파일 이름 목록을 반환하고 cat은 이를 인쇄합니다.