같은 줄에있는 두 단어를 grep하는 방법은 무엇입니까? [복제]
이 질문에 이미 답변이 있습니다.
- grep 20 답변으로 한 줄의 두 문자열 일치
줄에 두 개의 입력 단어가 포함 된 줄을 어떻게 grep합니까? 두 단어가 모두 포함 된 줄을 찾고 있는데 어떻게해야합니까? 다음과 같이 파이프를 시도했습니다.
grep -c "word1" | grep -r "word2" logs
첫 번째 파이프 명령 후에 멈췄습니다.
왜?
왜 통과 -c
합니까? 일치하는 수만 표시됩니다. 마찬가지로를 사용할 이유가 없습니다 -r
. 나는 당신이 읽는 것이 좋습니다 man grep
.
같은 줄에있는 2 개의 단어를 grep하려면 다음을 수행하십시오.
grep "word1" FILE | grep "word2"
grep "word1" FILE
FILE에서 word1이있는 모든 행을 grep "word2"
인쇄 한 다음 word2가있는 행을 인쇄합니다. 따라서 파이프를 사용하여 결합하면 word1과 word2가 모두 포함 된 행이 표시됩니다.
같은 줄에 2 개의 단어가있는 줄 수만 계산하려면 다음을 수행하십시오.
grep "word1" FILE | grep -c "word2"
또한 질문을 해결하기 위해 왜 멈추는가 :에서 grep -c "word1"
파일을 지정하지 않았습니다. 따라서에서 grep
입력을 기대 하므로 stdin
중단 된 것처럼 보입니다. Ctrl+ D를 눌러 EOF (파일 끝)를 보내 종료 할 수 있습니다.
처방
질문에서 명령을 간단히 다시 작성하면 다음과 같습니다.
grep "word1" logs | grep "word2"
첫 번째 grep
는 'logs'파일에서 'word1'이있는 줄을 찾은 다음 grep
'word2'가 포함 된 줄을 찾는 두 번째 줄에 공급합니다 .
그러나 이와 같은 두 가지 명령을 사용할 필요는 없습니다. 확장 grep
( grep -E
또는 egrep
)을 사용할 수 있습니다 .
grep -E 'word1.*word2|word2.*word1' logs
줄에서 'word1'이 'word2'앞에 오는 것을 알고 있다면 대안이 필요하지 않으며 regular grep
은 다음을 수행합니다.
grep 'word1.*word2' logs
'하나의 명령'변형은 실행중인 프로세스가 하나뿐이라는 장점이 있으므로 'word1'을 포함하는 행을 파이프를 통해 두 번째 프로세스로 전달할 필요가 없습니다. 이것이 얼마나 중요한지는 데이터 파일의 크기와 'word1'과 일치하는 줄 수에 따라 다릅니다. 파일이 작 으면 성능이 문제가되지 않으며 두 개의 명령을 실행하는 것이 좋습니다. 파일이 크지 만 몇 줄에만 'word1'이 포함 된 경우 파이프에 전달되는 데이터가 많지 않으며 두 개의 명령을 사용하는 것이 좋습니다. 그러나 파일이 크고 'word1'이 자주 발생하는 경우 단일 명령으로 이러한 오버 헤드를 피할 수있는 파이프 아래로 중요한 데이터를 전달할 수 있습니다. 이에 반하여 정규식은 더 복잡합니다. 최상의 결과를 찾기 위해 벤치마킹해야 할 수도 있지만 성능이 정말 중요한 경우에만 가능합니다.grep
초 단위로 처리되는 데이터의 양을 최소화합니다.
진단
초기 스크립트는 다음과 같습니다.
grep -c "word1" | grep -r "word2" logs
이것은 이상한 명령 시퀀스입니다. 첫 번째 grep
는 표준 입력에서 'word1'의 발생 횟수를 계산하고 해당 숫자를 표준 출력에 인쇄합니다. EOF를 표시 할 때까지 (예 :를 입력하여 Control-D) 입력 할 때까지 기다립니다. 두 번째 grep
는 디렉토리 아래의 파일 logs
(또는 파일 인 경우 파일에서)에서 'word2'에 대한 재귀 검색을 수행합니다 logs
. 또는 제 경우 logs
에는 파이프 라인을 실행하고 있는 파일이나 디렉터리가 없기 때문에 실패 합니다. 두 번째 grep
는 표준 입력을 전혀 읽지 않으므로 파이프가 불필요합니다.
Bash를 사용하면 부모 셸은 파이프 라인의 모든 프로세스가 종료 될 때까지 대기하므로 grep -c
EOF를 표시 할 때까지 수행하지 않는 완료를 기다립니다 . 따라서 코드가 멈춘 것처럼 보입니다. 로 주얼리 쉘 , 두 번째 grep
완료하고 종료하고 쉘 프롬프트가 다시. 이제 두 개의 프로세스 (첫 번째 grep
와 셸)가 실행 중이며 둘 다 키보드에서 읽으려고 시도하며 어떤 입력 줄 (또는 주어진 EOF 표시)을 가져 오는지 결정하지 않습니다.
첫 번째에 대한 입력으로 데이터를 입력 한 경우에도 grep
출력에 'word2'가 포함 된 모든 행만 표시됩니다.
각주:
한때 대답은 다음과 같습니다.
grep -E 'word1.*word2|word2.*word1' "$@"
grep 'word1.*word2' "$@"
이로 인해 아래 댓글이 발생했습니다.
awk를 사용할 수 있습니다. 이렇게 ...
cat <yourFile> | awk '/word1/ && /word2/'
순서는 중요하지 않습니다. 따라서 파일이 있고 ...
, file1이라는 파일에는 다음이 포함됩니다.
word1 is in this file as well as word2
word2 is in this file as well as word1
word4 is in this file as well as word1
word5 is in this file as well as word2
그때,
/tmp$ cat file1| awk '/word1/ && /word2/'
결과,
word1 is in this file as well as word2
word2 is in this file as well as word1
예, awk가 더 느립니다.
주요 문제는 첫 번째 grep에 입력을 제공하지 않았다는 것입니다. 다음과 같이 명령을 다시 정렬해야합니다.
grep "word1" logs | grep "word2"
발생 횟수를 계산하려면 두 번째 grep에 '-c'를 입력하십시오.
아래 명령으로 고양이 시도
cat log|grep -e word1 -e word2
grep word1 file_name | grep word2
나에게 가장 쉬운 방법 인 것 같아
grep 사용 :
grep -wE "string1|String2|...." file_name
또는 다음을 사용할 수 있습니다.
echo string | grep -wE "string1|String2|...."
git grep
다음은 부울 표현식을 사용 git grep
하여 여러 패턴을 결합 하는 구문입니다 .
git grep -e pattern1 --and -e pattern2 --and -e pattern3
위의 명령은 한 번에 모든 패턴과 일치하는 줄을 인쇄합니다.
파일이 버전 제어를받지 않는 경우 --no-index
param을 추가 합니다.
Git에서 관리하지 않는 현재 디렉터리에서 파일을 검색합니다.
man git-grep
도움을 확인하십시오 .
또한보십시오:
- grep을 사용하여 string1과 string2를 일치시키는 방법은 무엇입니까?
- Check if all of multiple strings or regexes exist in a file.
- How to run grep with multiple AND patterns?
- For multiple patterns stored in the file, see: Match all patterns from file at once.
참고URL : https://stackoverflow.com/questions/6480687/how-to-grep-for-two-words-existing-on-the-same-line
'program story' 카테고리의 다른 글
N 채널을 듣는 방법? (0) | 2020.08.11 |
---|---|
Java에서 루프에 비해 스트림의 장점은 무엇입니까? (0) | 2020.08.11 |
$ .when.apply ($, someArray)는 무엇을합니까? (0) | 2020.08.11 |
Python에서 숫자를 문자열로 포맷 (0) | 2020.08.11 |
jQuery .offset ()로 위치 가져 오기 및 설정 (0) | 2020.08.11 |