리눅스 `uniq` 명령어는 텍스트 파일에서 고유하거나 중복된 줄을 찾아주는 유용한 도구입니다. 이 글에서는 `uniq` 명령의 다양한 기능과 활용법을 자세히 알아보겠습니다.
텍스트 줄에서 일치하는 항목 찾기
`uniq` 명령어는 신속하고 효율적인 기능을 제공하지만, 다른 리눅스 명령어처럼 몇 가지 제약 사항이 있습니다. 이러한 제약 사항을 미리 알아두면 명령어 사용 시 혼란을 줄일 수 있습니다. `uniq`는 단일 목적을 위해 설계되었으므로, 파이프를 통해 다른 명령어와 함께 사용할 때 특히 강력한 성능을 발휘합니다. `uniq`와 자주 함께 사용되는 명령어는 `sort`입니다. `uniq`는 정렬된 입력을 필요로 하기 때문입니다.
이제 `uniq` 명령어를 실제로 사용해 보겠습니다!
기본 `uniq` 명령어 실행
로버트 존슨의 노래 “I Believe I’ll Dust My Broom” 가사가 담긴 텍스트 파일을 예시로 사용해 보겠습니다. `uniq` 명령어가 이 파일을 어떻게 처리하는지 살펴보겠습니다.
다음 명령어를 입력하여 출력을 `less`로 파이프합니다.
uniq dust-my-broom.txt | less
출력 결과를 확인하면, 중복된 라인을 포함한 전체 가사가 그대로 출력됩니다.
이 결과만 보면 `uniq`가 고유한 줄이나 중복된 줄을 제대로 처리하지 못하는 것처럼 보일 수 있습니다.
이것은 `uniq` 명령어의 기본적인 특징 때문입니다. 옵션 없이 `uniq` 명령어를 실행하면 `-u` (고유한 행만 출력) 옵션이 적용된 것과 동일하게 작동합니다. 즉, 파일에서 고유한 줄만 출력합니다. 중복된 줄이 표시되는 이유는 `uniq`가 중복된 줄을 인식하려면 해당 줄들이 연속해서 나타나야 하기 때문입니다. 그래서 정렬이 중요한 역할을 합니다.
파일을 정렬하면 중복된 줄들이 한데 모아지게 되므로, `uniq`는 이들을 중복된 줄로 인식할 수 있습니다. 이제 파일에 `sort` 명령어를 사용하여 정렬한 다음, 그 결과를 `uniq`로 파이프하고 최종 출력을 `less`로 파이프해 보겠습니다.
다음 명령어를 입력합니다.
sort dust-my-broom.txt | uniq | less
`less`를 통해 정렬된 줄 목록을 확인할 수 있습니다.
노래 가사 중 “I believe I’ll dust my broom”이라는 구절이 여러 번 등장합니다. 실제로 이 구절은 노래의 처음 네 줄 내에서 두 번 반복됩니다.
그렇다면 왜 고유한 줄 목록에 나타날까요? 파일에서 해당 구절이 처음 나타날 때는 고유한 줄이기 때문입니다. 그 이후에 나타나는 구절들만 중복으로 처리됩니다. 고유한 각 줄의 첫 번째 출현을 나열한다고 생각할 수 있습니다.
이번에는 `sort`를 사용하여 출력을 새 파일로 리디렉션해 보겠습니다. 이렇게 하면 매번 명령어를 사용할 때마다 `sort`를 사용할 필요가 없습니다.
다음 명령어를 입력합니다.
sort dust-my-broom.txt > sorted.txt
이제 정렬된 파일을 가지고 작업을 시작할 수 있습니다.
중복 횟수 계산
`-c` (count) 옵션을 사용하여 파일의 각 줄이 나타나는 횟수를 출력할 수 있습니다.
다음 명령어를 입력합니다.
uniq -c sorted.txt | less
각 줄은 파일에서 해당 줄이 나타나는 횟수로 시작합니다. 첫 번째 줄이 비어 있다는 것을 알 수 있습니다. 이것은 파일에 5개의 빈 줄이 있다는 것을 의미합니다.
출력을 숫자 순서로 정렬하려면 `uniq`의 출력을 `sort`로 전달할 수 있습니다. 이 예에서는 `-r` (역순) 및 `-n` (숫자 정렬) 옵션을 사용하고 결과를 `less`로 파이프합니다.
다음 명령어를 입력합니다.
uniq -c sorted.txt | sort -rn | less
이제 목록은 각 줄의 출현 빈도에 따라 내림차순으로 정렬됩니다.
중복 라인만 출력
파일에서 반복되는 행만 확인하려면 `-d` (중복) 옵션을 사용할 수 있습니다. 파일에서 줄이 몇 번 중복되더라도 한 번만 나열됩니다.
이 옵션을 사용하려면 다음을 입력하십시오.
uniq -d sorted.txt
중복된 라인이 출력됩니다. 맨 위에 빈 줄이 있는 것을 볼 수 있습니다. 이는 파일에 중복된 빈 줄이 있다는 것을 의미합니다. `uniq`가 단순히 목록의 모양을 맞추기 위해 추가한 공간이 아닙니다.
`-d` (중복) 및 `-c` (개수) 옵션을 함께 사용하고 정렬을 통해 출력을 파이프할 수도 있습니다. 이를 통해 최소 두 번 이상 나타나는 줄의 정렬된 목록을 얻을 수 있습니다.
다음 명령어를 입력합니다.
uniq -d -c sorted.txt | sort -rn
모든 중복 라인 출력
모든 중복된 행과 파일에서 해당 행이 나타날 때마다 항목을 확인하려면 `-D` (모든 중복 행) 옵션을 사용하면 됩니다.
이 옵션을 사용하려면 다음을 입력하십시오.
uniq -D sorted.txt | less
출력 목록에는 각 중복된 행에 대한 항목이 포함됩니다.
`–group` 옵션을 사용하면 각 그룹 앞, 뒤, 또는 양쪽에 빈 줄을 추가하여 중복된 모든 줄을 출력할 수 있습니다.
다음은 `–group=append`를 사용하여 각 그룹 뒤에 빈 줄을 추가하는 예시입니다.
uniq --group=append sorted.txt | less
그룹은 읽기 쉽도록 빈 줄로 구분됩니다.
특정 문자 수 확인
기본적으로 `uniq`는 각 줄의 전체 길이를 확인합니다. 그러나 검사 범위를 특정 문자 수로 제한하려면 `-w` (문자 확인) 옵션을 사용할 수 있습니다.
다음 예에서는 비교 범위를 처음 세 문자로 제한하여 이전 명령어를 반복해 보겠습니다.
uniq -w 3 --group=append sorted.txt | less
결과와 그룹화가 상당히 다른 것을 확인할 수 있습니다.
“I b”로 시작하는 모든 줄은 해당 부분이 동일하므로 함께 그룹화되어 중복으로 간주됩니다.
마찬가지로, “I’m”으로 시작하는 모든 줄도 나머지 텍스트가 다르더라도 중복으로 처리됩니다.
특정 문자 수 무시
파일의 줄에 번호가 매겨져 있는 경우처럼 각 줄의 시작 부분에서 특정 문자 수를 건너뛰는 것이 유용한 경우가 있습니다. 예를 들어, 타임스탬프를 건너뛰고 첫 번째 문자가 아닌 6번째 문자부터 행을 확인하고 싶을 수 있습니다.
다음은 번호가 매겨진 줄로 정렬된 파일의 예시입니다.
`uniq`가 세 번째 문자부터 비교 검사를 시작하도록 하려면 `-s` (문자 건너뛰기) 옵션을 사용하고 다음 명령어를 입력합니다.
uniq -s 3 -d -c numbered.txt
줄이 중복으로 인식되고 정확하게 계산됩니다. 표시된 줄 번호는 각 중복 항목의 첫 번째 항목 번호입니다.
문자 대신 필드(문자열과 공백으로 이루어진 부분)를 건너뛸 수도 있습니다. `-f` (필드) 옵션을 사용하여 `uniq`에 무시할 필드를 지정합니다.
`uniq`에게 첫 번째 필드를 무시하도록 지시하려면 다음 명령어를 입력합니다.
uniq -f 1 -d -c numbered.txt
각 줄의 시작 부분에서 3개의 문자를 건너뛰도록 `uniq`에 지시했을 때와 동일한 결과를 얻게 됩니다.
대소문자 무시
기본적으로 `uniq`는 대소문자를 구분합니다. 동일한 문자가 대문자와 소문자로 표시되면 `uniq`는 해당 행을 다른 것으로 간주합니다.
다음 명령의 출력을 살펴보겠습니다.
uniq -d -c sorted.txt | sort -rn
“I Believe I’ll Dusting my broom”과 “I believe I’ll Dusting my broom”이라는 줄은 “believe”의 “B” 대소문자 차이로 인해 중복으로 처리되지 않습니다.
하지만 `-i` (대소문자 무시) 옵션을 포함하면 이러한 행은 중복으로 처리됩니다. 다음 명령어를 입력합니다.
uniq -d -c -i sorted.txt | sort -rn
이제 해당 라인이 중복으로 처리되어 함께 그룹화됩니다.
리눅스는 다양한 특수 유틸리티를 제공합니다. 그중 많은 명령어와 마찬가지로 `uniq`는 매일 사용하는 도구는 아닐 수 있습니다.
따라서 리눅스를 능숙하게 사용하기 위해서는 현재 문제를 해결할 수 있는 도구가 무엇인지, 어디서 다시 찾을 수 있는지 기억하는 것이 중요합니다. 꾸준히 연습하면 익숙해질 것입니다.
또는 언제든지 How-To Geek을 검색해 보세요. 아마 관련 기사가 있을 것입니다.