본문으로 바로가기

리눅스 운용시에 원하는 정보만을 추출하여 정보를 재구성해야 하는 일이 있습니다. 아래에서는 /etc/passwd를 예를 들어 설명합니다.

awk 이용

/etc/passwd 의 내용을 보면 ' : ' 를 구분자를 사용하여 계정 사용자 정보의 항목들이 구분되어 있다는 것을 알 수 있다. awk 명령어의 필드분리명령에 의해 왼쪽부터 차례대로 $1,$2....$7 에 대응된다.

계정명    :    패스워드부분    :    UID    :    GID    :    코멘트    :    홈디렉토리    :    기본사용쉘

  $1                  $2                  $3           $4             $5                $6                     $7

cat /etc/passwd | awk -F: '{print $1}'

  root
  bin
  daemon
  adm
  lp
  sync
  ...(중략)
  • -F: 는 구분자로 ':' 를 사용하겠다는 의미
  • {print $1} 은 $1 만을 출력하라는 것

응용 예제

특정 단어를 추가하여 출력에 포함시킬 수 있다.

cat /etc/passwd | awk -F: '{print "계정명 : "$1"    " "홈디렉토리 : "$6}'

  계정명 : root 홈디렉토리 : /root
  계정명 : bin 홈디렉토리 : /bin
  계정명 : daemon 홈디렉토리 : /sbin
  계정명 : adm 홈디렉토리 : /var/adm
  계정명 : lp 홈디렉토리 : /var/spool/lpd
  계정명 : sync 홈디렉토리 : /sbin

awk를 활용하여 실계정사용자들의 /etc/shadow 파일을 출력하는 예를 살펴본다.

grep home /etc/passwd | awk -F: '{print "grep "$1" /etc/shadow"}'

  grep nestgoer /etc/shadow
  .... (중략)

/etc/passwd 에서 home이라는 문자열이 들어간 것들 중에 첫번째 구역을 출력한다. 이때 grep '첫번째구역' /etc/shadow 와 같이 출력한다. 첫번째 구역은 계정명 구역이므로 홈디렉토리(/home)를 가진 사용자를 출력하게 되는 것이다.

위 결과를 가지고 SHELL 스크립트를 작성하기 위해 다시 아래와 같이 test.sh 에 저장한다.

grep home /etc/passwd | awk -F: '{print "grep "$1" /etc/shadow"}' > test.sh

파일을 열어 첫행에 #! /bin/bash 를 입력해 스크립트 파일로 만든다.

vi test.sh

  #! /bin/bash
  grep nestgoer /etc/shadow 
  ...

파일을 실행가능한 파일을 만들기 위하여 test.sh 파일에 700 이라는 퍼미션을 주고 이를 실행한다.

chmod 700 test.sh
 ./test.sh

위 파일은 /etc/passwd 파일중에서 /home 을 홈디렉토리로 시작하는 모든 계정들의 /etc/shadow 파일을 생성한 것이다.

아래는 /etc/passwd 파일을 /etc/group 파일내용으로 만드는 것이다. /etc/group 파일의 형식은 "ID:x:GID:소속계정리스트" 이나 소속계정리스트는 구현이 어려우니 이를 무시하고 진행한다.

cat /etc/passwd | awk -F: '{print $1":x:"$4":"}'

  root:x:0:
  bin:x:1:
  daemon:x:2:
  adm:x:4:
  lp:x:7:
  sync:x:0:

이상 알아본 내용들은 서버간에 계정을 이동시킬 경우 유용하게 사용된다.



댓글을 달아 주세요

  1. 러스 2016.07.25 14:37

    awk로는 로그인 쉘을 가진 사용자와 로그인 쉘이 지정되지 않은 사용자로 구분해서 정렬이 불가능한가요?