7. 유틸리티 (Utilities) ( 유닉스철학하나 ) 작은분야의일을훌륭하게해내는자그마한도구들을개발자들에게제공하고개발자들은이도구들을창의적으로결합하여사용하자. $ which which
71 7.1 소개 구분 Utilities 구분 Utilities 화일여과 grep, fgrep, egrep uniq (3 장참조 ) 화일변환 compress, crypt, sed, uncompress, tr, ul 화일정렬 sort 전자우편검사 biff 화일비교 cmp, diff 순수화일내용보기 od 화일보관 tar, cpio, dump 화일시스템마운팅 mount, umount 화일보관 find 사용자대치 su 명령어스케줄 at, cron, crontab 셀확인 whoami 텍스트처리 awk k(3 장참조 ) 문서준비 nroff,spell,style,troff l 하드및소프트링크 ln Unix 시스템 2
72 7.2 파일여과 패턴여과 : egrep/fgrep/grep / 명시된패턴 (pattern) 이없는줄만을여과 그레이브악센트부호 (`) 로둘러싸인명령어는표준출력으로대치 $ echo there are `who wc -l` users on the system $ vi `grep -l debug *.c` # debug 패턴을포함하며.c로끝나는모든화일들을 vi 편집 화일여과 utility [ 교재 p293 참조 ] : egrep, fgrep, grep, uniq 1 grep, fgrep, egrep: 명시된패턴이있는 / 없는줄만을여과 grep/frep/egrep - hilnvw pattern {filename}* -n ( 줄번호표시 ) -i( 대소문자무시 ) -l( 화일목록 ) -v ( 일치하지않은줄 ) -w( 단어단위로탐색 ) 명시된화일이없으면표준입력을탐색한다. pattern : grep( 정규식 ) fgrep( 일정한문자열만 ) egrep( 확장된정규식 ) ( 예 )$ grep the inputfile ( 예 )$ grep -nw the inputfile Unix 시스템 3
정규표현식 (7 장참조 ) 정규식의예 [ 교재 p296, p780 참조 ] ( 주의1) 반드시단일따옴표안에! ( 주의 2) *, +,? 은이전문자에적용됨 grep, egrep 정규표현식 :. [] * ^ $ \ ( 예 ).nd ^.nd sw.*ng [A-D] \. a. a.$ im*ing ing egrep 확장정규표현식 : +? () ( 예 ) s.*w s.+w off will im*ing im?ing 정규표현식 : grep 특수문자. 임의의단일문자 [ ] 괄호안의단일문자중어느것과일치 * 문자다음에나타남, 바로앞의문자가 0번 h는그이상발생 ^ 줄의시작, [ ] 안에서는제외 (except) 의미 $ 줄의끝 \( 백슬래시 ) 메타문자앞에위치, 메타문자의특수의미제거 확장정규표현식 : egrep 특수문자 + 단일문자가 1 번이상발생? 단일문자가 0번혹은 1번발생 ( 파이프기호 ) or 연산자역할 ( ) *, +,? 메타문자가괄호안의전체표현식에대해동작 Unix 시스템 4
72 7.2 파일여과 반복줄제거 : uniq 인접한, 반복줄을여과 2 uniq: 동일한내용이인접반복된줄들을한줄만남기고여과 uniq -c -number [ inputfile [outputfile] ] -c ( 해당줄이반복된횟수를보여줌 ) -number (number 번째항목을무시하고패턴탐색 ) ( 예 )$ uniq inputfile [p297(290) 참조 ] ( 예 )$ uniq -c inputfile ( 예 )$ uniq -1 inputfile Unix 시스템 5
73 7.3 화일정렬 : SORT sort t[ -tc -r ]{ {sortfield -b -f -M -n}* {filename}* -tc 정렬을위한비교항목들을구분하는문자를 c로새로이설정 (default: 이옵션이생략되어있으면, blank 나 tab 으로구분한다 ) -r 내림차순으로정렬 (default: ASCII 표에의한오름차순 ) -b 줄의앞부분에있는공백을무시 (default: blank도정렬시비교대상임 ) -f 대소문자를무시하고정렬 -M 월 (month) 순으로정렬 ( 단, $ LANG=en_US) -n 숫자의크기순으로정렬 sortfield 특정항목을기준으로정렬하도록지정 ( 다수항목지정가능 ) +number1 -number2" 의형태 number1은시작항목번호를, number2는정지항목번호를나타냄시작항목번호는 0부터시작 ( 즉, -0 은첫번째항목을가리킴 ) 정지항목번호는정렬대상에서제외되며생략시모든항목이포함 Unix 시스템 6
73 7.3 화일정렬 : SORT ( 예 ) $ sort -r sortfile 역순으로정렬 $ sort +0-1 sortfile [ 교재 p293] 첫번째항목만을기준으로정렬 $ sort +0b -1 sortfile 첫번째항목만을기준으로정렬하되, 줄의앞부분에나오는공백을무시하여첫번째항목을잡는다. $ LANG=en_US $ sort +0bM -1 +4 -n sortfile 공백을무시하면서첫번째항목을기준으로월별로정렬한후, 그후에다섯번째항목이하를숫자크기로추가로정렬 $ sort -t: +0bM -1 +2 -n sortfile2 항목구분을 ':' 로한다. 공백을무시하여첫번째항목을월별로정렬한후, 세번째항목이하를숫자크기로추가정렬 필드안의글자지정 % sort +0.0b 0.1b sortfile 공백을무시하면서첫번째항목의첫번째글자로정렬 sort의다수항목지정하는두가지방법 % sort +0bM -1 +4 -n sortfile %sort -k 1,1bM -k 5,5n sortfile (-k field_start[type][,field_end[type], field는 1부터시작, type은 bdfimnr ) Unix 시스템 7
74 7.4 파일비교 cmp diff 두화일의동일성을검사하여, 차이가생기는첫번째바이트를보여줌 두화일을비교하여한파일을다른화일로전환하는편집변경을행할때에필요한동작목록을보여줌 (3종류의편집변경이제공됨 ) Unix 시스템 8
74 7.4 화일비교 cmp [-l -s] filename1 filename2 [offset1 offset2] 내용이동일하면, 종료값은 0으로서, 출력으로는아무것도보여주지않음다르면, 종료값은 1 으로서, 출력으로는일치하지않은첫번째바이트의옵셋 (offset: 문자의순서값 ) 과위치한줄번호을보여줌 만일어느한쪽화일이짧으면, 짧은쪽화일이름앞에 EOF 메시지를붙임 -l 일치하지않는모든바이트들에대한옵션과각각의문자값을보여줌 -s 모든출력을금지한다 (sillent) offset1 filename1의비교시작위치에대한옵셋 offset2 filename2 의비교시작위치에대한옵셋 ( 예 ) $ cmp lady1 lady2 $ cmp lady2 lady3 $ cmp -l lady1 lady2 Unix 시스템 9
74 7.4 화일비교 diff [ -i -Dflag ] filename1 filename2 -i 대소문자의구분을무시한다 (ignore) -Dflag C preprocessor를위한출력을생성 출력형태 1: 첨가 (addition) firststart a secondstart, secondstop > 두번째화일에서첫번째파일로첨가되어야할부분출력형태 2: 삭제 (deletion) firststart, firststop d linecount < 첫번째화일에서제거되어야할줄들 출력형태 3: 변경 (change) firststart firststop c secondstart, secondstop < 첫번째화일에서치환되어야할줄 --- > 치환을위하여사용되어야할두번째파일의줄 firststart 와 firststop 는첫번째화일의줄번호를의미하고 secondstart 와 secondstop는두번째화일의줄번호를의미 ( 예 ) $ diff lady1 lady2 3c3 $ diff lady2 lasy3 3a4,6 $ diff lady3 lady4 2,4d1 $ diff -Dflag lady3 lady4 #ifndef flag #endif flag를이용하여전처리기대상생성 Unix 시스템 10
75 7.5 화일보관 화일을보관하는이유 1 backup( 정기적, 보관용 ) 2 네트워크연결이안된컴퓨터로의데이터전송 cpio : 화일복사용. 오직하나의 backup volume으로저장한다. 소규모백업에적당 tar : tape에화일을보관함. 추가저장시항상뒷부분에저장됨. 오직하나의 backup volume으로저장. 소규모백업에적당 ufsdump/ufsrestore : 시스템관리자가전체시스템을백업하고추출하는데사용. 개개의화일을다루는데는불편하지만, 정기적시스템백업에유용 (cf.) dd : 가장낮은레벨 data copy, 파일변환가능, 다른 OS 사이의이동 Unix 시스템 11
75 7.5 화일보관 cpio -ov > backupfile -o 표준입력으로부터복사 ( 백업 ) 할화일명의목록을받아복사 (ouput) -v 화일을복사하는동안각화일의이름을보여줌 (verbose) cpio -idtu patterns < backupfile -i 표준입력으로부터 cpio 형식파일 ( 이전에 cpio 로저장된화일 ) 을읽어서, 명시된 pattern에일치하는화일들모두를재생 (input) -d 필요하다면디렉토리를생성 -t 복사대신목차를보여줌 -u 무조건복사 cpio -pl directory -p 표준입력으로부터복사 ( 백업 ) 할화일명목록을받아서이를명명된 directory로복사 ( 하나의서브디렉토리복사시 cp -r 명령이더간단 ) -l 물리적복사대신에링크 (link) 를만듦결국디스크사용이전혀없슴 ( 반드시 p 와함께 -pl) Unix 시스템 12
75 7.5 화일보관 (cpio) ( 예 ) $ ls *.c cpio -ov > backup $ rm *.c $cpio-i i <backup $ find. -name \*.c -depth -print cpio -ov > backup2 패턴 *.c인모든화일들을서브디렉토리를포함하여백업 $ mkdir tmp; cd tmp cpio id <../backup2 $ find. -mtime -2 -print cpio -p./tmp 현재의디렉토리에있는화일들중에서지난 2일동안수정된모든화일들을 tmp 디렉토리에복사 $ find. -mtime -2 -print cpio -pd./tmp 서브디렉토리생성 $ find. -mtime -2 -print cpio pld./tmp 현재의디렉토리에있는화일들중에서지난 2 일동안수정된화일들을 tmp 디렉토리에링크함 Unix 시스템 13
75 7.5 화일보관 (tar) tar -cvf tarfilename filelist -c filelist에대한 tar형식의백업화일을생성 (create) -v 진행되는상황을설명 (verbose) -f tar형식의백업화일이름을지정 (default: /dev/rmt/0 tape drive) tar -txru tarfilename [ filelist ] -t tar형식의백업화일안에어떤것들이들어있는지목차만보임 (title) -x 백업화일로부터화일을추출복귀 (extract) -r filelist를기존의백업화일뒤에무조건덧붙임 (rear) -u 기존의백업화일에이미포함되어있는 filelist 중수정된화일들만을백업화일의뒤에덧붙임. 디렉토리가있어도 recursive하게적용 Unix 시스템 14
75 7.5 화일보관 (tar) ( 예 )$ tar -cvf tarfile. $ tar -tvf tarfile $ tar -rvf tarfile reverse.c $ tar -uvf tarfile reverse.c $ mkdir./tmp $cdtmp $ tar -xvf../tarfile $ tar -xvf../tarfile `tar -tf../tarfile grep '.*\.c'` C 프로그램화일들만추출한다 $ tar -xvf../tarfile./reverse.c 파일이름에 나오면표준출력또는표준입력 $ tar cvf -. (cd tmp; tar xvf -) Unix 시스템 15
75 7.5 화일보관 (ufsdump & ufsrestore) ufsdump 와 ufsrestore e 는수퍼유저만사용가능 (Linux 에서는 /sbin/dump 와 /sbin/restore) /usr/sbin/ufsdump [level] [f dumpfile] [v] [w] filesystem level 덤프의수준을지정. 명시된 level 보다낮거나같은 level 에서최근에덤프한이후에수정된모든화일들만을덤프시킴 (default 값 : 9) 만일 level을 0으로하면, 항상모든파일들을덤프하게됨 f 덤프될화일 (dumpfile) 을지정 (defautl: /dev/rmt8) v 화일을덤프하는동안각화일의이름을보여줌 (verbose) w 백업을수행하는대신, 덤프될모든화일의목록을보여준다 /usr/sbin/ufsdump [level] [f dumpfile] [v] [w] {filename }+ 지정된화일들만을덤프한다. ( 예 ) $ ufsdump 0fv /dev/rmt/0 / [ Linux: $ /sbin/dump -0f /dev/st0 / ] root(/) partition 화일시스템을테이프드라이버 /dev/rmt/0로 level 0 덤프수행 $ ufsdump fd 0fv backup. [Li Linux: $/bi /sbin/dump/d 0f backup. ] 현재디렉토리의모든파일을./backup로 level 0 덤프수행 백업레벨 : 0 ~ 9 Sat Sun Mon Tue Wed Thu Fri 0-5 5 5(3) 5 5 Unix 시스템 16
75 7.5 화일보관 (ufsdump & ufsrestore) /usr/sbin/ufsrestore/ / -irtx [ f dumpfile ] { filename }+ -i 대화형복구. 사용자에게복구할지말지를목록을보여주면서진행한다. -r dumpfile에있는모든화일을현재의디렉토리로복구 -t 복구는하지않고그대신에 dumpfile 내용의목록들만을보여준다 -x 복구 (extract) ( 예 )$ ufsrestore xf /dev/rmt0 wine.c hacking.c $ ufsrestore xf./backup (volume #: 1 디스크볼륨개수 ) [ Linux: $ /sbin/restore xf./backup ] $ ufsrestore tf./backup $ ufsrestore rf./backup $ ufsdump 0fv -. (cd tmp; ufsrestore xf -) [ Linux: $ /sbin/dump/ 0fv -. ( (cd tmp; p;/ /sbin/restore/ xf - ] Unix 시스템 17
76 7.6 화일탐색 find pathlist expression pathlist 화일을탐색할경로의리스트 (recursive search) expression -name pattern 화일이름이 pattern과일치하면참 (*, [, ],? 포함가능 ) -perm oct permission i 의 8 진수표현이 oct 와일치하면참 -type ch 화일의유형이 ch이면참 (ch: b=block, c=char) -user userid 화일의소유자가 userid이면참 -group groupid 화일의그룹이 groupid이면참 -atime count 접근 (access) 한날수가 count 이내이면참 -mtime count 수정 (modify) 한날수가 count 이내이면참 -ctime count 수정되고화일의속성이바뀐날수가 count이내이면참 -exec command 수행중인 command 의종료값이 0 이면참. \; 로끝남 command의 argument가 {} 이면, 현재화일의이름으로치환 -print 현재화일명을프린트하고참값을반환 -ls 현재화일의속성을보여주고참값을반환 -cpio device 현재의화일을 cpio 형식 (5120 byte records) 으로 device에쓰고참값반환!expression expression 의논리부정 \( expr1 [-a] expr2 \) 두 expression의 and \( expr1 [-o] expr2 \) 두 expression의 or Unix 시스템 18
76 7.6 화일탐색 ( 예 )$fi find. -name '*.c'' -print 현재의디렉토리나그서브디렉토리에서모든 C 소스프로그램을찾아그화일명들을프린트 $ find. -mtime 14 -ls 지난 14일동안수정된화일들을표시 (+ more than, = exactly, - less than) $ find. -name '*.bak' -ls -exec rm {} \; '.bak' 으로끝나는화일들의속성을표시한후에제거함 $ find. \( -name '*.o' -o -name '*.txt' \) -print '.o'' 로끝나거나 '*.txt'' 로끝나는화일들의이름을프린트함 $ find / -perm -4755 ls $ find / -perm -4700 -ls Unix 시스템 19
77 7.7 명령스케쥴링 crontab cron에의하여일련의작업이주기적으로실행되도록함. cron 은단일프로세스로서시스템시작부터종료까지동작하는데, /var/spool/cron/crontabs 디렉토리에복사등록된 crontab 화일들을수행함 at 지정된시간에작업이실행되도록함 Unix 시스템 20
77 7.7 명령스케쥴링 crontab crontabname cron (daemon) 시스템에의하여사용되는 crontabname의 crontab 파일을등록 crontabname 없으면표준입력으로입력하고 CONTROL-D crontab -l -e -r [ username ] -l 등록된 crontab 화일의내용을보여준다 (list) -e 등록된 crontab 화일의내용을편집한다 (edit) -r 등록된 crontab 화일을등록해제한다 (remove) username 사용자만자신의 crontab 화일을소유하도록함 /var/cron/log 파일에 cron daemon 이처리한내용기록 Unix 시스템 21
77 7.7 명령스케쥴링 crontab 화일의형식 minute (0-59) hour (0-23) day (1-31) month (1-12) weekday (1-7, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat, 7=Sun) command unix 명령어 처음다섯항목에 * 가오면항상일치됨을의미 명령의표준출력은자동적으로사용자에게 mail utility를통하여전송 % 다음의문자는임시화일에복사되고, 명령의표준입력으로사용됨 ( 예 ) $ tty /dev/pts/1 $ crontab ***** * * * * echo one minute passed > /dev/pts/1/ /1 $ crontab e $ crontab r Unix 시스템 22
77 7.7 명령스케쥴링 ( 예 )$ cat crontab.cron 0 8 * * 1 echo Happy Monday Morning > /dev/pts/1 * * * * * echo One Minute Passed > /dev/pts/1 30 14 1 1 * mail users % Jan Meeting At 3 pm 월요일아침 8시에전자우편을발송매분마다 pts(pseudo tty slave) 터미날 /dev/pts/1에에코함. 1월 1일오후 2:30에모든사용자에게임박한회의를상기시킴 $ crontab crontab.con $ crontab -l $ crontab -l mysung 사용자별로확인하는것은슈퍼유저만이사용가능 개별사용자가 crontab 을사용하는것을허용하거나금지하는방법 : /var/spool/cron/crontabs(linux는 /var/spool/cron/) 에사용자이름으로 crontab 생성 : /usr/lib/cron 또는 /etc/cron.d에 cron.deny와 cron.allow 두화일이모두존재하지않으면슈퍼유저만사용가능함 : cron.allow 가존재하지않고 cron.deny 가비어있으면모든사용자가사용가능 Unix 시스템 23
77 7.7 명령스케쥴링 at -c -s -m time [date [, year] ] [ +increment] [script] -c 각명령어가 C shell로수행됨을의미 -s 각명령어가 Bourne shell로수행됨을의미 -m 작업이완료되면전자우편을보내도록함 script script 화일로부터작업을읽는다 (default: 표준입력 ) time HH 또는 HHMM 의형식 (am/pm 이뒤따름 ) now ( 지금 ) date 요일또는달의처음세글자 today ( 오늘 ) tomorrow ( 내일 ) date 생략시, time이현시각보다뒤이면 date는 today로, time이현시각보다앞이면 date는 tomorrow로간주됨 increment 숫자 [ minutes hours days weeks months years ] Unix 시스템 24
77 7.7 명령스케쥴링 at -r { jobid }+ -r 명시된작업을 at 큐로부터제거 (Linux는 atrm JobID) at -l {jobid}* -l 뒤따르는작업들의목록을보여줌 ( 예 ) $ at now +1 minutes < at.sh $ at -l $ at 17:35 < at.sh $ at 0934am Sep 18 < at.sh $ at 9:34 Sep 18, 1996 < at.sh $ at 11:00pm tomorrow < at.sh $ at 9pm Jan 13 < at.sh $ at 10pm Wed < at.sh Unix 시스템 25
77 7.7 명령스케쥴링 ( 예 ) $ at 8am at> 명령어입력 at> ^D $ tty /dev/pts/12 $ cat at.sh date > /dev/pts/12 ( 자신의가상터미널로 ) # Reschedule Script at now +1 minutes < at.sh 개별사용자가 at를사용하는것을허용하거나금지하는방법 : /var/spool/cron/at.allow ll (Linux 는 /var/spool/at/at.allow ll 와 /var/spool/at/at.deny) ( 사용자이름목록 ) : 만일두화일이모두존재하지않으면슈퍼유저만사용가능함 : at.allow 가존재하지않고 at.deny 가비어있으면모든사용자가사용가능 Unix 시스템 26
78 7.8 프로그램가능한텍스트처리 awk : Aho, Weinberger, Kernighan awk -Fc [-f filename] 'program' {variable=value}* {filename}* -Fc 입력줄의항목구분자를 c 로정함 (default:tab 이나공백 ) -f filename awk 프로그램을화일로만들었을때이를지정함 'program'' awk 명령어안에 awk 프로그램을직접기록한경우 {variable=value}* 프로그램을위한변수치환 {filename}* 입력줄을표준입력이아닌지정된파일에서받아들임 Unix 시스템 27
78 7.8 프로그램가능한텍스트처리 awk 'program': 다음의형식으로된하나이상의명령어 [ condition ] [ \{ action \} ] condition: BEGIN( 첫번째줄을읽기전 ), END ( 모든줄을읽고난후 ), 논리연산자, 관계연산자, 정규식을포함하는조건식 cf. 만일 condition이생략되면모든줄에대하여수행됨 action(c-like): if ( 조건 ) 문장 [else 문장 ] while ( 조건 ) 문장 for ( 연산 ; 조건 ; 연산 ) 문장 break continue print printf " 형식 " next exit 변수 = 연산식 { 문장들의리스트 } action 들은 C 언어처럼 semicolon(;) 으로구분함 (cf.) 만일 action이생략되면해당줄은표준출력됨 Unix 시스템 28
78 7.8 프로그램가능한텍스트처리 입력줄의항목접근 - $1 ( 첫번째항목 ) $2( 두번째항목 ) - $0 ( 줄전체 ) - 내장변수 NF ( 현재의입력줄의항목개수 ) $NF ( 마지막항목 ) - 내장변수 NR ( 현재의입력줄의줄번호 ) -내장변수FILENAME( 입력화일이름 ) BEGIN과 END $ awk '{ print NF, $0 }' float $ cat awk2 BEGIN { printf "start of file:", FILENAME } { print $1 $3 $NF } END { printf "End of file" } $ awk -f awk2 float cf. print나 printf에서컴마 (,) 가없으면연속인쇄, 있으면공백인쇄 $ cat awk3 #2,3번째줄에대하여항목인쇄 NR > 1 && NR < 4 { printf NR, $1, $3, $NF } $ awk -f awk3 float Unix 시스템 29
78 7.8 프로그램가능한텍스트처리 연산자 $ cat awk3 #2,3번째줄에대하여항목인쇄 NR > 1 && NR < 4 print NR, $1, $3, $NF $ awk -f awk3 float 사용자정의변수의사용 - 초기값 : null string 또는정수 0 $ cat awk4 # 줄을표준출력에보내고줄과단어수를셈 BEGIN{print"Scanning file" } { printf "line %d: %s \n", NR, $0; linecount++; wordcount += NF; } END { printf "line %d, words = %d\n", linecount, wordcount} $ awk -f awk4 float Unix 시스템 30
78 7.8 프로그램가능한텍스트처리 제어구조 (C-like) $ cat awk5 [ 교재 p317] # 각줄의항목을역순으로출력 { for ( i = NF ; i >= 1; i--) printf "%s", $i; printf "\n"; } 줄일치에확장된정규식사용 [1-p709] $ cat awk6 #t와 e 사이에 1개이상의단일문자가나오는줄 /t.*e/ { print $0 } 조건범위 : 콤마 (,) 로분리되는두개의조건 - 처음조건을만족하는줄부터두번째조건을만족하는줄까지의범위 $ cat awk7 #strong 포함하는줄부터 clear 포함하는줄까지 /strong/, /clear/ { print $0 } 내장함수이용가능 - exp(), log(), sqrt(), int(): C-like - substr(str, x, y): x번째문자부터 y번째문자까지의 str의 substring bti $ awk -f awk5 float Unix 시스템 31
79 7.9 하드링크와소프트링크 : In 하드링크 : 동일한화일시스템내에서의링크여러개의레이블생성이가능하나, 물리적화일은동일함 하드링크가추가될때마다링크계수항목이증가 소프트링크 ( 심볼릭링크 ) 다른파일시스템들간의링크 링크계수항목이증가하지않고대신에 permission 에 l--- 식으로기록됨 ls -F 로참조할때화일이름뒤에 @ 가표시됨 Unix 시스템 32
79 7.9 하드링크와소프트링크 : In ln -f -s original newlink -f 슈퍼유저가디렉토리에하드링크를생성할수있게함 -s 소프트링크로서화일시스템을확장가능 ln -f -s { original }+ directory 명시된화일 (original) 들에대한링크를 directory 에생성 ( 예 ) $ ln hold.3 hold $lnhold* hold. tmpdir $ ln -s /usr/include/stdio.h stdio.h $ ls -l stdio.h lrwxrwxrwx 1 mjkim 20 Jan 12 17:58 stdio.h -> /usr/include/stdio.h $ ls -F stdio.h@ Unix 시스템 33
710 7.10 사용자대치 : su su [-] [ username ] : 사용자대치 (substitute user) default: root 새로운 shell prompt; # 사용자대치의종료 :^D 7.11 전자우편검사 : biff 유닉스셸은수신되는전자우편을주기적으로점검함. 따라서전자우편을수신한시간과유닉스셸이전자우편도착을알려주는시간에는다소차이가있음 /usr/ucb/biff [ y n ] y 전자우편수신즉시통고하도록설정함 n 전자우편수신즉시통고하지않도록함아무옵션없이사용하면현재의 biff 상태를나타내줌 /usr/ucb/from/ Unix 시스템 34
compress/uncompress crypt 712 7.12 화일변환 파일을압축하고다시해독복귀시킨다. sed tr 키암호를받아들여파일을암호화하거나해독한다 스트림편집, 하나이상의화일을스캔하여특정조건에맞는모든줄을편집한다. 단순반복편집에유용하다 화일내의문자를한문자집합에서다른문자집합으로변환 (transform) Unix 시스템 35
712 7.12 화일변환 compress -c -v { filename }+ -v 압축되는상황을보여줌 -c 압축된화일로원래의파일을덮어쓰지않고표준출력으로내보냄 (default: 원래의화일을지우고압축된파일 (.z) 로치환 ) uncompress -c -v { filename }+ ( 예 ) $ compress -v palindrom.c reverse.c $ uncompress -v *.Z pack과 compress 손실 (lossy) 사운드, 이미지 JPEG, MPEG 무손실 (lossless) 문서, 데이터베이스, 실행파일 pack 과 compress pack : Huffman compression(40%).z $ pack * $ unpack * compress : Lempel-Ziv compression(61%).z $ uncompress * 압축파일변경않고해제하여표준출력 $ pcat xx.z (pack 으로압축된경우 ) $ zcat part1.doc.z wc (compress로압축된경우 ) Unix 시스템 36
712 7.12 화일변환 zip -r -v { filename }+ -v 압축되는상황을보여줌 -r 디렉토리일경우재귀적으로 (recursively) -n 디렉토리내의지정된확장자를가진파일을제외하고압축 -x 디렉토리내의지정된파일을제외하고압축 (default: 원래의화일을지우고압축된파일 (.z) 로치환 ) unzip -p -v { filename }+ -d 지정된디렉토리에추출 -c 추출한파일을파이프로출력 (stdout) ( 예 ) $ zip -rv foo foo $ unzip dv tmp gzip -r -v { filename }+ -v 압축되는상황을보여줌 -r 디렉토리일경우재귀적으로 (recursively)q -c 압축된화일로원래의파일을덮어쓰지않고표준출력으로내보냄 gunzip -c -v { filename }+ -c 추출한파일을파이프로출력 (stdout) t) ( 예 ) $ gzip -rv foo foo $ gunzip cv foo Unix 시스템 37
712 7.12 화일변환 crypt [ key ] < originalfile i > cryptedfile 암호화 crypt [ key ] < cryptedfile > originalfile 해독화 key가명시되지않으면대화식으로물어봄 ( 화면에보이지는않음 ) crypt key의형태로명령을주었을때 ps로체크됨에주의 ( 예 ) $ crypt agatha < sample.txt > sample.crypt $ crypt agatha < sample.scrypt > sample.txt Unix 시스템 38
712 7.12 화일변환 sed [ -e script ] [ -f scriptfile ] { filename }* -f scriptfile sed 편집명령을파일로저장수행 -e script sed 편집명령지정 (script = 'sed 폅집명령 ) addressrange s/expr/str 정규식 expr이첫번째발생을문자열 str로대치 addressrange a/expr/str/g / /g 모든정규식 exp을문자열 str로대치 address r name address 줄뒤에화일 name 의내용덧붙이기 address i\ text address줄뒤에텍스트 text 삽입 addressrange d addressrange로지정된줄을삭제 addressrange c\ text Unix 시스템 39
712 7.12 화일변환 addressrange c\ text addressrange로명시된텍스트를 text로치환 addressrange a\ text addressrange로명시된텍스트뒤에 text를첨가 만일주소가명시되어있지않으면모든줄에대하여적용 ( 예 ) $ sed 's/^/ / /' arms > arms.indent 화일의들여쓰기실행 $ sed 's/^ *//' arms.indent 각줄앞에있는공백제거 $ sed '/a/d' arms 정규식 'a' 를포함하는모든줄을삭제 $ sed '/\<a\>/d' arms 단어 'a' 를포함하는모든줄을삭제 $ sed -e 's/^/<< /' -e 's/$/ >>/' arms '<<' 를줄의맨앞에, '>>' 를줄의맨뒤에삽입함 Unix 시스템 40
712 7.12 화일변환 tr -c -d -s string1 string2 string1 문자 ( 집합 ) 을 string2 문자 ( 집합 ) 으로변환시킴 -c string1의보어 (complement) 를취함. 즉, 지정된문자이외의문자들 -d string1에있는문자들을표준출력에서제거 -s 반복출력되는문자를한번만출력하도록함 (Bourne shell tr 예 ) $ tr [a-z] [A-Z] < go.cart 모든소문자를대문자로변환 $ tr [a-c] [A-C] < go.cart 소문자 a, b, c를대문자 A, B, C 로변환 $ tr -c a [X*] < go.cart 소문자 a 가아닌모든문자를 X 로치환 $ tr -c [a-z] [ \012 *] ( 또는 [ \n *]) < go.cart 소문자 a부터 z가아닌모든문자를아스키값 (012) 8 (new line) 로치환 $ tr -d [a-c] < go.cart 소문자 a부터 c까지를제거 Unix 시스템 41
712 7.12 화일변환 (C shell tr 예 ) $ tr [a-z] [A-Z] < inputfile 모든소문자를대문자로변환 $ tr [a-c] [A-C] < inputfile 소문자 a, b, c를대문자 A, B, C 로변환 $ tr -c a [X*] < inputfile (?) 소문자 a 가아닌모든문자를 X 로치환 $ tr -c [a-z] [\n*] ( 또는 [\012*] ) < inputfile (?) 소문자 a부터 z가아닌모든문자를아스키값 (012) 8 (new line) 로치환 $ tr -d [a-c] < inputfile 소문자 a부터 c까지를제거 Unix 시스템 42
713 7.13 순수화일내용보기 : od (octal dump) od -abcdfhios[n]x filename [offset [.][b]] ]] -A 바이트를문자로해석하고, 아스키로프린트 ( 예 : 0 = null) -b 바이트를부호없는 8진수로해석 -c 바이트를문자로해석하고, C 표기로프린트 ( 예 : 0 = \0) -d 2바이트쌍을부호없는 10진수로해석 -f 4바이트쌍을부동소숫점수로해석 -o 2바이트쌍을부호없는 8진수로해석 -s 2 바이트 word(16bits) 를 signed decimal 로해석, -t d2 와같음 -S 4 바이트 long word(32 bits) 를 signed decomal로해석, -t d4와같음 -t 출력타입 (acfdoux) 을지정 (a, f, d, o, u, x) -x 2 바이트쌍을 16 진수로해석 offset 리스팅이시작되는위치지정만일 b로지정되면블록 (512바이트) 수로해석되고, 다른경우는 8진수 (octal) 로해석됨, 뒤에.( 점 ) 있으면십진수로해석 ( 예 ) $ od /bin/od 1000 화일 /bin/od를 8진수로덤프 $ od -c /bin/od 1000 화일 /bin/od를 1000번지부터바이트단위의 C ( 문자 ) 표기방법으로보여줌 Unix 시스템 43
714 7.14 화일시스템마운트 mount -ooptions [ devicename directory y] -ooptions 유효한코드 (rw: 읽기쓰기, ro: 읽기전용 ) umount devicename (disk 예 ) $ mount ( 또는 $ /sbin/mount) $ mount /dev/dsk/c0t3d0s5 /opt $ umount /opt ( 또는 /dev/dsk/c0t3d0s5) (floppy disk 예 ) $ volcheck -v (floppy 매체조사하여장치가발견되었는지알려주고볼륨이름파일생성 ) $ mount ( 현재마운트된장치들목록, /etc/mnttab 참조 ) $ umount /floppy/ 볼륨이름 $ mount -F pcfs /vol/dev/diskette0/ 볼륨이름 /floppy/ 볼륨이름 ( 원하는마운트포인트 ) $ mount -F ufs /vol/dev/diskette0/ / / / 볼륨이름 /floppy/ 볼륨이름 ( 원하는마운트포인트 ) $ mount -F nfs mysung:/share /mnt ( 원하는마운트포인트 ) $ df -k ( 마운트된파일시스템의 free disk를 byte 단위로보고 ) $ cat /etc/mnttab ( 마운트된파일시스템목록 ) [ Linux: /etc/mtab ] $ cat /etc/vfstab ( 다중사용자부팅시자동설치될파일시스템목록 ) [ Linux: /etc/fstab ] Unix 시스템 44
714 7.14 화일시스템마운트 Fedora Core 5 device mount (cdrom 예 ) # mkdir /media/cdrom # mount /dev/cdrom r /media/cdrom ( # mount t iso9660 /dev/cdrom r /media/cdrom ) # mount ( 마운트된위치확인 ) # umount /dev/cdrom (usb 예 ) # mkdir /media/disk # mount /dev/sdb1 /media/disk ( # mount -t vfat /dev/sdb1 /media/disk ) # mount ( 마운트된위치확인 ) # umount /dev/sdb1 (disk 예 ) # mkdir /media/floppy # mount /dev/fd0 /media/flopp ( # mount -t ntfs /dev/fd0 /media/flopp ) # mount ( 마운트된위치확인 ) # umount /dev/fd0 Unix 시스템 45
714 7.14 화일시스템마운트 volume management daemon(/usr/sbin/vold) 이작동중일때 # volcheck를사용하여마운트디스켓을삽입한후 $ volcheck 명령을사용하여마운트마운트가되면 / 에 floppy라는디렉토리가생기며그하위의 floppy0라는 디렉토리로디스켓에접근가능 /usr/sbin/vold는 /vol에플로피, CD-ROM 등이동매체들의의미적이름 (symbolic name) 의드라이버파일을생성 $ volcheck 실행하면 /vol/dev/diskette0/ 에 볼륨이름 파일생성디스켓에는 /vol/dev/diskette0/ 볼륨이름 (noname) 으로접근 ( 예 ) mount -F pcfs /vol/dev/diskette0/noname /mnt (Linux) mount -t iso9660 /dev/cdrom /mnt/cdrom 수동으로마운트하기 $ /etc/init.d/volmgt stop 명령으로 volume management를정지시키고 $ mount -F pcfs /dev/fd0 /mnt 명령으로마운트시킨후 /mnt 디렉토리에서디스켓에접근가능 (cf.) $ /etc/init.d/volmgt start 이때 /vol 사용중이면에러발생 volume management 가작동하지않을때 $ mount -F pcfs /dev/fd0 /mnt 명령으로마운트시킨후 /mnt 디렉토리에서디스켓에접근가능 Unix 시스템 46
714 7.14 화일시스템마운트 Solaris File System 의 Raw and Block Partition /dev/rdsk/ : 문자단위 /dev/dsk/ : 블록단위 Solaris 2.x 의파일시스템타입 디스크기반파일시스템타입 vfs : Virtual File System ufs : Unix File System hsfs : High Sierra File System(standard CD ROM File System) pcfs : DOS File System Mountable on Unix 네트워크기반파일시스템 nfs : Network File System RAM 기반파일시스템 procfs : /proc File System cachefs : Cache File system specfs : Special File System swapfs : Swap File System tmpfs : /tmp File System fdfs : File Descriptor File Systems lofs : Loopback File System fifofs f : First-In-First-Out t t File System namefs : UNIX STREMS(terminal interface) 가 file descriptors의동적인마운 Unix 시스템 트를위해사용하는파일시스템 47
715 7.15 셸확인 whoami 716 7.16 터미널확인 : tty tty 7.17 텍스트포맷팅 nroff, troff spell 텍스트포맷팅을위한일종의마크업언어 WYSIWYG (What You See Is What You Get) 편집기로대치됨 철자법오류를알려줌 Unix 시스템 48
과제 5 11 월 29 일까지 과제 5 1. 매일아침, crontab을사용하여실행오류의산물인 core 파일들을삭제하 도록스케줄하는스크립트 rmcore 작성 ( 참고문헌 p358 참조 ) 2. 파일시스템에서명시된기간동안접근되지않았던모든파일들을주기적으로찾아서그들을압축된형태로저장하는스트립트 compressold 작성 3. 이름, 주소, 전화번호가알파벳순서로된리스트에접근하여입력 / 수정 / 검색할수있는전화번호부유틸리티완벽한버전 ( 입력, 수정, 검색 ) 작성 ( 참고문헌 p193 참조 ) 과제제출방법 1. Electrical Version 1 csblade.incheon.ac.kr (211.119.245.149) 의 /export/home/2007hw/ulahw 또는 ulbhw에자신의학번으로숙제방 ( 디렉토리 ) 만들고그안에복사 자신의디렉토리보호권장 : chmod 700 directoryname 2. Electrical Version 2 csblade.incheon.ac.kr (211.119.245.75) 의 /home/2007hw/ulahw 또는 ulbhw 에자신의학번으로숙제방 ( 디렉토리 ) 만들고그안에복사 자신의디렉토리보호권장 : chmod 700 directoryname Unix 시스템 49