grep 검색의 출력을 다른 grep의 입력으로 연결하려고 합니다. 예를 들어:
grep search_query * | grep -v but_not_this
그러나 두 번째 grep은 이전 검색의 출력을 사용하지 않습니다. 두 번째 grep은 대신 *를 사용하는 것 같습니다. 예를 들어,
grep lcov *
tst/bits/Module.mk:21:$(call func_report_lcov)
tst/drivers/Module.mk:27:$(call func_report_lcov)
하지만 "call"이 포함된 결과를 필터링하려면
grep lcov * | grep -v call
...
나를 잡아줘내 작업 공간의 모든 행"전화"를 포함하지 않습니다.
환경 정보:
- 이것은 bash와 Fish 모두에서 발생합니다.
- 아래와 같이 grep 명령에 대한 별칭을 설정했습니다.
alias grep='grep -nR --color=always'
내가 놓친 다른 것이 있습니까?
답변1
앨리어싱이 그 이유입니다. 에서 man grep
이 -R
옵션을 사용하면 grep
"각 디렉터리 아래의 모든 파일을 반복적으로 읽습니다". 따라서 파이프 다음 부분은 첫 번째 출력을 무시하고 grep
대신 grep
현재 디렉터리에서 모든 파일을 반복적으로 반복합니다.
별칭을 우회하고 바닐라 grep 및 \grep
.
grep lcov * | \grep -v call
그러나 개인적으로 -R
별칭을 입력하는 것이 혼란스럽다고 생각합니다.
답변2
흥미로운. 이것나타나다세부 사항은 말 그대로 악마처럼 보입니다.
grep "search_query" *
가능한와는 다르다
grep search_query *
어느가능한그리고 다른
grep 'search_query' *
이 시도:
grep search_query * > /tmp/foo
grep -v but_not_this /tmp/foo
파일에 /tmp/foo
원하는 내용이 포함되어 있나요? 원하는 답을 얻었
나요 ? unalias 로 바꾸고 작동하는지 확인하십시오. grep -v but_not_this
grep
\grep