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

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



답변

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

grep 'pattern' file /dev/null

줄 번호를 얻으려면 :

grep -n 'pattern' file /dev/null


답변

옵션이 -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에 의해 지정


답변

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

grep --with-filename 'pattern' file

줄 번호로 :

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


답변

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

패턴 (예 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 에서 나를 위해 일했습니다 .


답변

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


답변

grep 'search this' *.txt

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


답변