grep이 같은 문자열을 여러 번 인쇄하지 못하게하는 방법은 무엇입니까?


15

다음을 포함하는 파일을 grep하면

These are words
These are words
These are words
These are words

... 단어 These에 대해서는 문자열을 These are words네 번 인쇄합니다 .

grep이 반복되는 문자열을 두 번 이상 인쇄하지 못하게하려면 어떻게합니까? 그렇지 않으면 grep의 출력을 조작하여 중복 행을 제거하려면 어떻게해야합니까?


일치하는 순서를 출력에 유지해야합니까? 그렇지 않으면 John1024 게시 명령이 작동합니다.
kos

답변:


23

유닉스 철학은 한 가지 일을 잘 수행하는 도구를 갖추는 것입니다. 이 경우 grep파일에서 텍스트를 선택하는 도구입니다. 중복이 있는지 확인하기 위해 텍스트를 정렬합니다. 중복을 제거하기 위해 -u옵션을 사용합니다 sort. 그러므로:

grep These filename | sort -u

sort많은 옵션이 있습니다 : 참조 man sort. 중복 수를 계산하거나 중복 여부를 결정하기 위해 더 복잡한 체계를 원하면 정렬 출력을 uniq: 로 파이프하고 옵션에 grep These filename | sort | uniq대해서는 manuniq`을 참조하십시오 .


2

grep단일 문자열 만 찾는 경우 및 추가 스위치 사용

grep -m1 'These' filename

에서 man grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

또는 awk ;) 사용

awk '/These/ {print; exit}' foo

가장 적절한 대답은 -m 플래그입니다. 나는 당신이 대답의 맨 위에 그것을 놓을 것을 제안합니다. 아주 좋은 답변입니다!
Sergiy Kolodyazhnyy

3
정규식을 사용하는 경우 작동하지 않습니다. 첫 번째 일치 직후에 중지되며 가능한 각 일치 항목을 하나만 얻지 마십시오.
csvan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.