재귀 grep이 STDOUT에서 작동하지 않는 이유는 무엇입니까? [폐쇄]

재귀 grep이 STDOUT에서 작동하지 않는 이유는 무엇입니까? [폐쇄]

나는 오랫동안 내 Ubuntu/Mint 컴퓨터에서 일부 사용자 지정 별칭(예: alias grep='grep -irn --color --line-buffered'.

디버깅을 시도하는 동안 문제의 옵션이 STDOUT을 grep'ping하는 대신 현재 디렉터리에서 재귀적으로 검색하는 재귀 옵션이라는 것을 알았습니다.

저는 현재 grep 2.16을 실행 중이고 예상대로 2.10을 실행하는 시스템을 발견했습니다.

예: tail -f /var/log/xxx.log | grep -irn yyy

-r-d recurse다음 디렉토리 옵션 대신 / make grep 검색 폴더에 어떤 변경이 이루어졌습니까 man?

-d ACTION, --directories=ACTION
    If an input file is a directory, use ACTION to process it.
    [...] If ACTION is recurse, read all files under each directory, recursively,
    following symbolic links only if they are on the command line. This is
    equivalent to the -r option.

답변1

이 답변은 댓글로 작성하는 것이 더 적합하지만 너무 길어서 답변으로 게시하겠습니다.

grep의 동작은 내 관심을 불러일으켰고 OP가 올바른 방향으로 가고 있다고 생각합니다. 또한 새로운 버전의 grep이 이전 버전과 다르게 동작한다는 것도 발견했습니다. 이전 버전에서는 를 사용할 때 인수를 전달하지 않으면 -r문서에 따라 표준 입력에서만 패턴을 검색합니다 grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given pattern. 그러나 최신 버전에서는 파일 이름을 제공하지 않아도 현재 디렉터리에서 패턴을 검색합니다. 확인하다:

$ mkdir /tmp/grep-test
$ cd /tmp/grep-test
$ echo pam > FILE
$ grep --version
grep (GNU grep) 2.10
(...)
$ grep pam -r
pam
pam
$ /home/ja/grep/grep-2.16/src/grep pam -r
FILE:pam

변경 로그를 greping하는 것 외에 이와 관련된 변경 사항에 대한 언급을 찾지 못했습니다.이것:

** 행동 변화

-r(--recursive) 옵션은 이제 명령줄 기호 링크만 따릅니다. 또한 기본적으로 -r은 이제 명령줄에 명명된 장치만 읽습니다. 이는 --devices로 재정의될 수 있습니다. -R은 이전과 동일하게 작동하므로 기본적으로 모든 심볼릭 링크를 따르고 모든 장치를 읽는 이전 동작을 선호하는 경우 -R을 사용하십시오.

OP가 stdout을 재귀적으로 검색한 이유는 여전히 의문이지만 grep에서 확실히 변경된 사항이 있습니다.

관련 정보