리눅스 운용시에 원하는 정보만을 추출하여 정보를 재구성해야 하는 일이 있습니다. 아래에서는 /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:
이상 알아본 내용들은 서버간에 계정을 이동시킬 경우 유용하게 사용된다.
'리눅스 > Linux 일반' 카테고리의 다른 글
리눅스 계정정보 변경 - chfn (0) | 2013.06.05 |
---|---|
리눅스 그룹 생성/삭제/확인/추가 - groupadd (5) | 2013.06.04 |
리눅스 파일 속성 변경으로 서버성능 향상 (0) | 2013.06.03 |
리눅스 /etc/passwd 와 /etc/shadow 필드 설명 (0) | 2013.06.02 |
리눅스 사용자추가(useradd) 환경 설정 (2) | 2013.06.02 |