[우분투] 시스템에서 추가된 패키지 검색 Computer Tip

우분투에서 설치된 패키지의 목록을 구하는 방법은,

$ dpkg --get-selections | grep -v deinstall | awk '{print $1}' | sort > /tmp/pl1.txt

와 같습니다.

$ dpkg -l
명령을 해도 되지만 테이블 형식으로 출력하느라 패키지 이름이 길 경우 잘릴 수 있습니다.

grep -v deinstall 명령은 purge 된 것은 나오지 않으나 deinstall 상태의 것은 나올 수 있기에
install 상태만 출력하기 위해 제하는 것이구요, awk '{print $1}' 명령은 첫번째 패키기 이름만
선택하는 것입니다. 
sort 명령은 다음에서 설명할 comm 명령을 위한 정렬한 것입니다.

우분투에서 어느 시스템을 설치하기 전에 위의 명령으로 /tmp/pl1.txt 라는 파일안에
accountsservice
acl
acpid
adduser
apparmor
apport
apport-symptoms
apt
apt-transport-https
apt-utils
apt-xapian-index
...

등의 패키지 명이 들어 있게 되어 있습니다.

그 다음 복잡한 시스템이 deploy 되었다는 가정하에

$ dpkg --get-selections | grep -v deinstall | awk '{print $1}' | sort > /tmp/pl2.txt
를 돌려 /tmp/pl2.txt 에 저장을 해 보았습니다.

그러면 다음에는 pl2.txt에 더 추가된 패키지 명을 찾아 보겠습니다.

예전에 리눅스 명령에서 sort, join, sed, awk 등으로 텍스트 작업을 많이 해 보았는데,
위와 같이 어느 단어 집합의 차집합을 구하는 것은 무엇이 있을까 하고 찾아보았더니,

comm 이라는 툴이 있었습니다.

설명은 "comm - compare two sorted files line by line" 으로 되어 있더군요.
설명에 따르면 정렬되어 있는 문자열이 있는 파일을 각 줄마다 비교하는 프로그램이라고 되어 있습니다.

이제 위와 같이 pl1.txt, pl2.txt 에 있는 패키지 내용에 따라 다음과 같은 작업을 진행할 수 있습니다.

우선 아무 옵션 없이 comm 명령을 실행시켜 보면,

$ comm /tmp/pl1.txt /tmp/pl2.txt
...
        linux-generic
linux-generic-lts-utopic
        linux-headers-3.13.0-32
        linux-headers-3.13.0-32-generic
linux-headers-3.16.0-30
linux-headers-3.16.0-30-generic
        linux-headers-generic
linux-headers-generic-lts-utopic
        linux-image-3.13.0-32-generic
linux-image-3.16.0-30-generic
        linux-image-extra-3.13.0-32-generic
linux-image-extra-3.16.0-30-generic
        linux-image-generic
linux-image-generic-lts-utopic
                linux-libc-dev:amd64
        localechooser-data
                locales
                lockfile-progs
...

와 같이 결과가 나옵니다.

linux-generic-lts-utopic
와 같이 첫번째 컬럼에 나타나는 것은 첫번째 파일인 pl1.txt 에만 존재하는 결과이고,

        linux-headers-3.13.0-32
와 같이 두번째 컬럼에 나타나는 것은 두번째 파일인 pl2.txt에만 존재하는 것입니다.

                locales
                lockfile-progs
와 같이 세번째 컬럼에 나타나는 것은 두 파일 모두 존재하는 것입니다.

이제 comm 명령에서 세 가지 옵션 -1, -2, -3 을 기억하면 되는데,
아주 간단하게 -3 옵션은 위의 컬럼에서 세번째 (공통으로 나오는 결과)를 제외시키는 것이고,
-2 옵션은 두번째만 나오는 결과를 제외시키는 것입니다.

이를 한번 더 응용하여 두번째 파일에만 나오는 결과를 확인해 보려면
-13 옵션을 적용하여 두번째 컬럼만 출력할 수 있습니다.

$ comm -13 /tmp/pl1.txt /tmp/pl2.txt
autotools-dev
byobu
curl
debhelper
dh-apparmor
freetds-bin
freetds-common
freetds-dev
...

(특별히 컬럼을 들여 결과가 나오지는 않습니다)

위에 옵션에서 -23 을 준다면 첫번째 파일에만 존재하는 결과가 출력됩니다.


어느분께는 도움이 되셨기를...



덧글

댓글 입력 영역

구글애드텍스트