줄을 일치시키기 전에 파일 이름 표시


282

grep출력에서 일치하는 줄 앞에 파일 이름을 표시하려면 어떻게 해야합니까?


2
pls는 grep 버전을 알려줍니다grep --version
Kent

3
켄트, grep --version그렙 버전을 아는 데 사용되는 명령입니까? 그렇다면 작동하지 않습니다. grep 버전을 알고있는 다른 명령을 찾을 수 없습니다.
Vivek

2
좋은 질문이지만 'Os version'은 혼란스러운 예제 파일 이름입니다.
HaveAGuess

1
여기서 OS와 버전은 관련이 없습니다.
MD XF

grep 'pattern' *
user0

답변:


430

이 작은 트릭을 사용 grep하여 여러 파일을 처리하고 있다고 생각하여 파일 이름을 표시하십시오.

grep 'pattern' file /dev/null

줄 번호를 얻으려면 :

grep -n 'pattern' file /dev/null

6
그렇습니다. /dev/null이 명령 을 추가 할 때의 의미가 무엇인지 말씀해 주 시겠습니까?
Vivek

55
grep여러 파일 이름이 제공되는 경우 일치하기 전에 파일 이름이 자동으로 표시되지만 단일 입력 파일 인 경우 파일 이름이 그대로 유지됩니다. 사용하여 /dev/null별도의 입력 파일로 grep"생각"그것은 여러 파일을 처리하지만, 물론 비어의 그것이 일치 목록에 표시되지 않도록을 / dev / null이며, ..
Scrutinizer

32
/ dev / null을 사용하는 것은 영리한 속임수이지만, -H 플래그 아래의 제안이 더 나은 대답이라고 생각합니다.
JohnQ

22
그래, -Hgrep 옵션은 POSIX의 일부가 아니며 사용되는 OS는 Solaris 10이며 표준 grep이나 POSIX 호환 버전 grep에는 -H옵션이 없습니다.
Scrutinizer

4
하위 디렉토리에 find . -name foo -exec grep pattern {} \;이름이 지정된 파일을 많이 가정 할 때 여전히 grep을 find와 함께 사용하는 경우 중요합니다 . 이 트릭은 내가 시도한 모든 Linux / OSX 버전에서 작동하는 것 같습니다. 참고 나는 그것이 더 깨끗 하다고 생각 하지만 아래 언급 한 것처럼 귀하의 버전에서는 지원되지 않을 수 있습니다 . foofindgrep/dev/null-Hgrep
Jon V

296

옵션이 -H있고 -n이용할 수있는 경우 ( man grep친구 인 경우) :

$ cat file
foo
bar
foobar

$ grep -H foo file
file:foo
file:foobar

$ grep -Hn foo file
file:1:foo
file:3:foobar

옵션 :

-H, --with 파일 이름

각 일치에 대한 파일 이름을 인쇄하십시오. 검색 할 파일이 둘 이상인 경우 이것이 기본값입니다.

-n, --line-number

각 출력 행 앞에 입력 파일 내의 1 기반 행 번호를 접 두부로 사용하십시오. (-n은 POSIX에 의해 지정됩니다.)

-H GNU 확장이지만 -n 되어 POSIX에 의해 지정


3
아니요, -H여기서 지원되지 않습니다.
Vivek

1
지원하지만 항상 grep을 제공합니다. file : 해당 파일 또는 디렉토리가 없음
pal4life

2
우분투 -H와 -n에서 작동합니다. 아마도 모든 최신 버전의 * nix
tgkprog

1
나는 저녁에 이러한 옵션이 있다고 생각하지 않고 수년 동안 어려움을 겪었습니다!
GreenSaguaro

45

트릭이 필요하지 않습니다.

grep --with-filename 'pattern' file

줄 번호로 :

grep -n --with-filename 'pattern' file

3
@ codeforester 나는 다른 grep것을 모른다. 그래서 나는 모른다.
MD XF

2
멋있는 ! 이것은 리눅스에서 작동했습니다. mac을 사용하는 경우 brew와 함께 coreutils를 설치할 수 있습니다. 그리고 PATH = "/ usr / local / opt / coreutils / libexec / gnubin : $ PATH"를 .bashrc
zw963

2
이 (또한) MinGW (1.0.17, 생각합니다) 에서 일했습니다 .
Peter Mortensen

내장 된 Mac grep (2.5.1-FreeBSD)에서 작동합니다. 그러나 Homebrew의 대체 grep을 사용하는 또 다른 방법은을 실행 brew install grep한 다음 사용하는 것 ggrep입니다. PATH를 수정할 필요가 없습니다.
wonderlr 2016 년

5

이 게시물에 대해 부분적으로 감사를 얻은 결과는 어떻습니까?

패턴 (예 filename=logfile.DATE:)이있는 여러 디렉토리 내에서 이름이 다르지만 패턴 (예 :)이있는 로그가있는 여러 파일을 찾으려고합니다 /logsapp1, /logsapp2. 각 파일에는 grep하려는 패턴 (예 :) "init time"이 있으며 "init time"각 파일 을 갖고 싶지만 파일이 속한 파일을 알고 싶습니다 .

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt

그런 다음 outputfilename.txt과 같은 것입니다

./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms

일반적으로

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt

설명:

find 명령은 패턴을 기반으로 파일 이름을 검색합니다

파이프 xargs -I{}find출력을{}

이것은 입력이 될 것입니다 grep ""pattern" {}

그런 다음 grep파일 이름 을 표시 하는 트릭\dev\null

마지막으로 다음과 같이 파일에 출력을 씁니다. tee outputfile.txt

이것은 grep버전 9.0.5 빌드 1989 에서 나를 위해 일했습니다 .


3
아니면 그냥 찾기를 사용find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
마틴

1

이것은 이전 솔루션에서 약간 수정되었습니다. 내 예제는 bash 스크립트에서 stderr 리디렉션을 찾습니다. grep '2>' $(find . -name "*.bash")


-7
grep 'search this' *.txt

나를 위해 모든 .txt 파일을 검색했습니다 (물론 검색 값을 입력하십시오).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.