강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
특정 패턴문자를 원하는 포맷으로 처리하는 awk 실무활용 2편
조회 : 5,137  


특정 패턴문자를 원하는 포맷으로 처리하는 awk 실무활용 2




ㅇ 제작 : 리눅스포털 수퍼유저코리아(www.superuser.co.kr) 박성수


ㅇ 본 자료의 자세한 모든 정보는 http://www.superuser.co.kr/linuxcommandbible/ 에서 확인하시기 바랍니다.

ㅇ 본 자료의 수정 및 편집은 허용되지않습니다.






3: /etc/passwd파일에서 각각의 ID와 홈디렉토리만을 출력하기


다음은 앞의 예를 조금 응용하여 각각의 ID와 함께 홈디렉토리까지 같이 출력하는 예를 보도록 하겠습니다. 실제 서버에 설정되어 있는 각각의 계정과 홈디렉토리를 확인해야할 경우에 실데이터를 만들기 위하여 사용하는 방법입니다.


이는 각각의 ID와 홈디렉토리를 조사하고자 할 때에 주로 사용되는 방법입니다.


[root@file root]# cat /etc/passwd | awk -F: '{print $1" "$6}'

root /root

bin /bin

daemon /sbin

gopher /var/gopher

ftp /var/ftp

nobody /

rpm /var/lib/rpm

vcsa /dev

nscd /

sshd /var/empty/sshd

rpc /

rpcuser /var/lib/nfs

nfsnobody /var/lib/nfs

mailnull /var/spool/mqueue

smmsp /var/spool/mqueue

pcap /var/arpwatch

apache /var/www

squid /var/spool/squid

webalizer /var/www/html/usage

xfs /etc/X11/fs

named /var/named

ntp /etc/ntp

gdm /var/gdm

postgres /var/lib/pgsql

bible /home/bible

sspark /home/sspark

working /home/working

locli /home/locli

mysql /home/mysql

test01 /home/test01

test02 /home/test02

test03 /home/test03

jinious /home/jinious

public /home/public

samba /home/samba

[root@file root]#

앞의 예와 다른 부분은 '{print $1" "$6}'뿐이므로 아래 전체명령어를 설명하면 다음과 같습니다.


/etc/passwd파일의 각행들을 ":"(콜론)으로 구분하여 첫번째인 ID와 여섯번째인 홈디렉토리를 결과로 출력하라는 의미입니다.




4: /etc/passwd 파일을 이용한 /etc/group 파일내용 만들기


이번에는 /etc/passwd파일을 이용하여 /etc/group파일의 내용을 만들어 보도록 하겠습니다.

/etc/group파일의 형식은 "ID:x:GID:소속계정리스트"와 같은 형태로 되어 있습니다.


여기에서 소속계정리스트는 각계정의 GID를 모두 조사하여 각 그룹리스트에 입력을 시켜주어야 하지만 awk명령어 한번으로 이를 만들기가 까다로우므로 소속그룹리스트가 없다는 가정하에 위와같은 형식의 /etc/group파일을 만들어 보도록 하겠습니다.


[root@file root]# cat /etc/passwd | awk -F: '{print $1":x:"$4":"}'

root:x:0:

bin:x:1:

daemon:x:2:

gopher:x:30:

ftp:x:50:

nobody:x:99:

rpm:x:37:

vcsa:x:69:

nscd:x:28:

sshd:x:74:

rpc:x:32:

rpcuser:x:29:

nfsnobody:x:65534:

mailnull:x:47:

smmsp:x:51:

pcap:x:77:

apache:x:48:

squid:x:23:

webalizer:x:67:

xfs:x:43:

named:x:25:

ntp:x:38:

gdm:x:42:

postgres:x:26:

bible:x:500:

sspark:x:501:

working:x:502:

locli:x:503:

mysql:x:504:

test01:x:505:

test02:x:506:

test03:x:507:

jinious:x:509:

public:x:510:

samba:x:511:

[root@file root]#


지금까지 사용했던 방법과 동일하게 "cat /etc/passwd"파일을 출력한 다음 ":"문자로 각행들의 항목들을 구분(-F:)한 다음 '{print $1":x:"$4":"}'이 출력되게 됩니다. 여기서 ""문자의 의미는 그뒤에 나오는 문자를 그대로 출력하기 위한 특수문자입니다.


따라서 $1ID를 출력하고 $4GID를 출력하므로 '{print $1":x:"$4":"}'의 결과는 "ID:x:GID:"와 같은 형태로 출력이 됩니다.


따라서 위의 명령의 결과는 /etc/group파일의 내용과 동일한 결과를 출력하게 됩니다.








5: /etc/passwd파일을 이용한 /etc/shadow 파일내용 만들기


이번에는 awk를 활용하여 실계정사용자들의 /etc/shadow파일을 출력하는 예를 보도록 하겠습니다.


먼저 grep명령어를 아셔야하는데 grep명령어의 자세한 설명은 이 책의 grep명령어편을 참고하시고, 아래명령어의 의미를 자세히 설명해 보도록 하겠습니다.


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


"grep home /etc/passwd"의 의미는 /etc/passwd파일내에서 home이라는 문자를 가진 행들은 모두 출력하라는 것입니다. , /etc/passwd파일에서 실계정을 사용하는 계정들이라면 그 홈디렉토리가 home이라는 것에서 착안한 것입니다. 만약 홈디렉토리를 host로 사용하는 계정사용자라면 "grep host /etc/passwd"라고 하시면 될 것이고, user1으로 사용한다면 "grep user1 /etc/passwd"으로 하면 될 것입니다.


따라서 "grep home /etc/passwd"의 결과로 인하여 /etc/passwd파일의 내용중 home을 홈디렉토리로 시작하는 계정들은 모두 출력이 될 것입니다.


그 다음 출력되는 각 행들을 awk의 입력으로 들어가기 위하여 "|"(파이프명령어)를 사용하였습니다.


, /etc/passwd파일의 각 행들에서 /home을 홈디렉토리의 시작으로 가지는 모든 계정들의 행의 출력이 awk -F: '{print "grep "$1" /etc/shadow"}'의 입력으로 들어가게 됩니다.


그 다음 awk -F: '{print "grep "$1" /etc/shadow"}'이 실행이 되면 다음과 같은 결과를 얻게 됩니다.


[root@file root]# grep home /etc/passwd | awk -F: '{print "grep "$1" /etc/shadow"}'

grep bible /etc/shadow

grep sspark /etc/shadow

grep working /etc/shadow

grep locli /etc/shadow

grep mysql /etc/shadow

grep test01 /etc/shadow

grep test02 /etc/shadow

grep test03 /etc/shadow

grep jinious /etc/shadow

grep public /etc/shadow

grep samba /etc/shadow

[root@file root]#


그 다음 위의 결과를 가지고 다음과 같이 간단한 SHELL스크립트를 작성합니다. 아래 보시는 바와 같이 vi를 열어서 "#!/bin/bash"를 첫행에 추가한 다음 test.sh이라는 파일을 만들었습니다.


[root@file home]# vi test.sh


#!/bin/bash

grep bible /etc/shadow

grep sspark /etc/shadow

grep working /etc/shadow

grep locli /etc/shadow

grep mysql /etc/shadow

grep test01 /etc/shadow

grep test02 /etc/shadow

grep test03 /etc/shadow

grep jinious /etc/shadow

grep public /etc/shadow

grep samba /etc/shadow

~

~

~

~

"test.sh" [New] 12L, 274C written

[root@file home]#


그런 다음 아래와 같이 실행가능한 파일을 만들기 위하여 test.sh파일에 700이라는 퍼미션을 주었습니다. 그리고 test.sh를 실행한 결과를 아래에서 보실 수 있을 것입니다.


[root@file home]# chmod 700 test.sh

[root@file home]#

[root@file home]# ./test.sh

bible:$1$Fy3B99j.$7Mx7eyV5MKvBJHUoJeWFG/:12352:0:99999:7:::

sspark:$1$1tmjn2RW$wMtE72wqdvwenDQLwk8ax0:12358:0:99999:7:::

working:$1$6tbDsd.O$viOzGkf9mm9sQdhquiCHS/:12363:0:99999:7:::

locli:$1$RZAcGxSH$wj0fKbsvSWldujaP8HXcE.:12363:0:99999:7:::

mysql:!!:12363:0:99999:7:::

test01:$1$4mOiFIeO$eNQiLLb6YZXTkYsGcEPMI.:12364:0:99999:7:::

test02:$1$sbmK0i0e$rI70QcI0poemRnwKFVHLj.:12364:0:99999:7:::

test03:$1$RgUe.iqW$WGPy1NlQXD/Kx8mThpJ57/:12364:0:99999:7:::

jinious:$1$ZgCGoUrb$VqxCMyR1WlCfb3jUGMKa21:12369:0:99999:7:::

public:$1$Nu9QKsAU$pv6PuSOwtI26BWRKxE/ix1:12364:0:99999:7:::

samba:$1$cq5x8KrL$tXBXggGlz/OwXsefgBU0G.:12364:0:99999:7:::

[root@file home]#


이 결과의 의미는 다음과 같습니다.


/etc/passwd파일의 각 계정들 중 /home을 홈디렉토리의 시작으로하는 모든 계정들의 /etc/shadow파일을 생성한 것입니다.


, 센서있는 독자분이 계시다면 이런 질문을 하실 것입니다. "이런것을 만들어서 어디에 쓸까요?"라고 질문을 하실지 모릅니다.


만약 여러분들께서 현재 사용하고 계시는 서버의 계정중 /home을 홈디렉토리의 시작으로 하는 모든 계정을 다른 서버로 이전하고자 한다면 그 계정들의 /etc/passwd파일의 내용과 /etc/shadow파일의 내용, 그리고 /etc/group파일의 내용을 이전되는 새서버에 원본과 동일하게 복사를 해주셔야 할 것입니다. 이때 매우 유용하게 사용하실 수 있습니다. 앞서 설명드린 /etc/group파일만드는 방법도 이와 같은 이유에서 예를 든 것입니다.


필자와 같이 실제 두대이상의 서버를 관리하면서 다른 서버로 일부 계정을 이전해야하는 경험을 하신 독자분이 계신다면 필자가 설명한 이 내용이 매우 유용하게 쓰일 것임을 확신합니다.






 

리눅스포털 –수퍼유저코리아- www.superuser.co.kr



[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1243


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
박성수
파파
헐렁고수