390 likes | 643 Views
7 장 . 유틸리티. 컴퓨터공학과 강성인. 7.2 파일 여과. 패턴여과 : egrep/fgrep/grep 명시된 패턴 (pattern) 이 없는 줄만을 여과한다 . 반복 줄 제거 : uniq 인접한 , 반복 줄을 여과한다. 정규 표현식 (Regular Expressions) (P. 296 참조 ) 확장된 정규 표현식 (P. 297 참조 ). 패턴 여과 명시된 패턴을 포함하지 않은 줄을 여과한다 . 정규 표현식은 단일 따옴표 안에 위치시켜 셸로 부터 간섭되지 않게 하여야 한다 .
E N D
7장. 유틸리티 컴퓨터공학과 강성인
7.2 파일 여과 • 패턴여과 : egrep/fgrep/grep • 명시된 패턴(pattern)이 없는 줄만을 여과한다. • 반복 줄 제거 : uniq • 인접한, 반복 줄을 여과한다.
정규 표현식(Regular Expressions) (P. 296 참조) • 확장된 정규 표현식 (P. 297 참조)
패턴 여과 • 명시된 패턴을 포함하지 않은 줄을 여과한다. • 정규 표현식은 단일 따옴표 안에 위치시켜 셸로 부터 간섭되지 않게 하여야 한다. -h 파일이름 제거 -i pattern의 대소문자 무시 -l pattern이 포함된 파일들의 목록(list) 표시 -n numbering. 일치하는 줄 앞에 줄번호 표시 -v pattern과 일치하지 않는 줄을 보여줌 -w 검색을 단어(word)단위로 실시 -x string과 정확하게 동일한 줄만을 출력 grep [ -hilnvw ] pattern {fileName}* egrep [ -hilnvw ] pattern {fileName}* fgrep [ -hilnvwx ] string {fileName}*
반복 줄 제거 : uniq • 동일한 내용이 인접 반복된 줄들을 한 줄만 남기고 여과 -c : 각 줄 앞에 줄이 반복된 횟수를 보여줌 -number : number번째 항목을 무시하고 패턴 탐색 uniq -c -number [ inputfile [outputfile] ]
:/home/sikang>cat animals cat snake monkey snake dolphin elephant dolphin elephant goat elephant pig pig pig pig monkey pig :/home/sikang>uniq-c animals 1 cat snake 1 monkey snake 2 dolphin elephant 1 goat elephant 2 pig pig 1 monkey pig :/home/sikang>uniq-c -1 animals 2 cat snake 3 dolphin elephant 3 pig pig
7.3 파일 정렬 sort [ -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 : 특정항목을 기준으로 정렬하도록 지정 시작 항목 번호는 0부터 시작(즉, -0 은 첫 번째 항목을 가리킴) 정지 항목 번호는 정렬 대상 에서 제외되며 생략 시 모든 항목이 포함 +number : number번째 필드를 기준으로 정렬 +number1 -number2 : number1은 시작 항목 번호를, number2는 정지 항목번호를 나타냄
$ sort -r sortfile : 역순으로 정렬 $ sort +0 -1 sortfile : 첫 번째 항목만을 기준으로 정렬 $ sort +0b -1 sortfile : 첫 번째 항목만을 기준으로 정렬하되, 줄의 앞부분에 나오는 공백을 무시하여 첫 번째 항목을 잡는다. $ LANG=en_US :-M옵션을 사용하기 위해서 LANG값을 변경 $ sort +0bM -1 +4n -5 sortfile : 공백을 무시하면서 첫 번째 항목을 기준으로 월별로 정렬한 후, 그 후에 다섯 번째 항목이하를 숫자 크기로 추가로 정렬 $ sort -t: +0bM -1 +3n -4 sortfile2 : 항목 구분을 ':'로 한다. 공백을 무시하여 첫 번째 항목을 월별로 정렬한 후, 세 번째 항목 이하를 숫자 크기로 추가 정렬 • 필드 안의 글자 지정 % sort +0.0b –0.1 sortfile : 공백을 무시하면서 첫 번째 항목의 첫 번째 글자로 정렬
7.4 파일 비교 • cmp 두 파일의 동일성을 검사하여, 차이가 생기는 첫 번째 바이트를 보여 줌 • diff 두 파일을 비교하여 한 파일을 다른 파일로 전환하는 편집 변경을 행할 때에 필요한 동작 목록을 보여 줌 (3종류의 편집변경이 제공됨)
7.4 파일 비교 cmp [-l -s] fileName1 fileName2 [offset1 offset2] • 내용이 동일하면, 종료 값은 0으로서, 출력으로는 아무 것도 보여주지 않음 • 다르면, 종료 값은 1으로서, 출력으로는 일치하지않은 첫 번째 바이트의 옵셋 (offset: 문자의 순서 값)과 위치한 줄 번호를 보여줌 • 만일 어느 한쪽 파일이 짧으면, 짧은 쪽 파일 이름 앞에 EOF 메시지를 붙임 -l : 일치하지 않는 모든 바이트들에 대한 옵션과 각각의 문자 값을 보여줌 -s : 모든 출력을 금지한다(silent) offset1 : fileName1의 비교 시작 위치에 대한 옵셋 offset2 : fileName2의 비교 시작 위치에 대한 옵셋
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는 두 번째 파일의 줄번호를 의미
:/home/sikang>diff lady1 lady2 3c3 < And all those loving words you say are right. --- > And everything you say to me is right. :/home/sikang>diff lady2 lady3 3a4,6 > It makes me feel, > I'm so in love with you. > Even in the dark I see your light. :/home/sikang>diff lady3 lady4 2,4d1 < I hold you close to me, < And everything you say to me is right. < It makes me feel,
7.5 파일 보관 • cpio : 파일 복사용. 오직 하나의 backup volume으로 저장한다. 소규모 백업에 적당 • tar : tape에 파일을 보관함. 추가 저장시 항상 뒷 부분에 저장됨. 오직 하나의 backup volume으로 저장. 소규모 백업에 적당 • ufsdump/ufsrestore : 시스템 관리자가 전체 시스템을 백업하고 추출 하는데 사용. 개개의 파일을 다루는 데는 불편 하지만, 정기적 시스템 백업에 유용
cpio -ov > backupFile -o :표준 입력으로부터 복사(백업)할 파일명의 목록을 받아 복사 -v : 파일을 복사하는 동안 각 파일의 이름을 보여 줌 -i : 표준 입력으로부터 cpio형식 파일(이전에 cpio로 저장된 파일)을 읽어서 명시된 pattern에 일치하는 파일들 모두를 재생 (input) -d : 필요하다면 디렉토리를 생성 -t : 복사 대신 목차를 보여 줌 -u : 무조건 복사(최근 file을 older file로 겹쳐쓰기 가능) -p : 표준 입력으로부터 복사(백업)할 파일명 목록을 받아서 이를 명명된 directory로 복사 (하나의 서브디렉토리 복사시 cp -r 명령이 더 간단) -l : 물리적 복사 대신에 링크(link)를 만듦 결국 디스크 사용이 전혀 없음 (반드시 p와 함께 -pl) cpio -idtu patterns < backupFile cpio -pl directory
:/home2/stud/04/sikang>ls lady* lady1 lady2 lady3 lady4 :/home2/stud/04/sikang>ls lady* | cpio -ov > backuplady lady1 lady2 lady3 lady4 16 blocks :/home2/stud/04/sikang>rm lady* :/home2/stud/04/sikang>cpio-id < ladybackup 16 blocks :/home2/stud/04/sikang>ls lady* lady1 lady2 lady3 lady4 :/home2/stud/04/sikang>
tar -cvf tarFileName fileList -c : fileList에 대한 tar형식의 백업 파일을 생성 -v : 진행되는 상황을 설명 -f : tar형식의 백업 파일 이름을 지정 (default: /dev/rmt/0 … tape drive) -t : tar형식의 백업 파일 안에 어떤 것들이 들어 있는지 목차만 보임 -x : 백업 파일로부터 파일을 추출 복귀(extract) -r : fileList를 기존의 백업 파일 뒤에 무조건 덧붙임(rear) -u : 기존의 백업 파일에 이미 포함되어 있는 fileList 중 수정된 파일들만을 백업 파일의 뒤에 덧붙임. 디렉토리가 있어도 recursive하게 적용 tar -txru tarFileName [ fileList ]
$ tar -cvf tarfile . $ tar -tvf tarfile $ tar -rvf tarfile reverse.c $ tar -uvf tarfile reverse.c $ mkdir ./tmp $ cd tmp $ tar -xvf ../tarfile $ tar -xvf ../tarfile `tar -tf ../tarfile | grep ‘lady*'` → C 프로그램 파일들만 추출한다 $ tar -xvf ../tarfile ./reverse.c
gzip –dlrtv9 {filename}+ -d : 압축을 푼다 -ㅣ : 현재 압축된 파일의 내용을 보여준다. -r : 현재 디렉토리부터 하위 디렉토리까지 전부를 압축한다. -t : 압축된 파일의 완전성을 검사한다. -v : 압축 진행상황을 보여준다. -9 : 최대한 압축한다. $ gzip –v9 tarfile $ ls tarfile.gz $ gzip –l tarfile.gz $ gzip –vd tarfile.gz $ gunzip tarfile.gz
7.6 파일 탐색 find pathList expression pathList파일을 탐색할 경로의 리스트 (recursive search) expression -name pattern 파일 이름이 pattern과 일치하면 참(*, [, ], ? 포함 가능) -perm oct permission의 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
$ 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 -400 –ls → 파일 허가권이 8진수 표현법으로 400인 파일들을 프린트 $ find . –name ‘*.c’–cpio cfile.cpio → c 소스 프로그램을 찾아서 “cfile.cpio”파일로 백업한다.
7.7 명령 스케쥴링 • crontab cron에 의하여 일련의 작업이 주기적으로 실행되도록 함. cron은 단일 프로세스로서 시스템 시작부터 종료 까지 동작하는데, /var/spool/cron/crontabs 디렉토리에 복사 등록된 crontab 파일들을 수행함 • at 지정된 시간에 작업이 실행되도록 함 • 개별 사용자가 crontab과 at을 사용하는 것을 허용하거나 금지하는 방법 • * /var/spool/cron/crontabs에 사용자 이름으로 crontab 생성 • * /usr/lib/cron 또는 /etc/cron.d에 cron.deny와 cron.allow 두 파일이 모두 존재하지 않으면 슈퍼유저만 사용 가능함 • * cron.allow가 존재하지 않고 cron.deny가 비어있으면 모든 사용자가 사용가능
crontab crontabName cron(daemon) 시스템에 의하여 사용되는 crontabName의 crontab 파일을 등록 crontabName 없으면 표준 입력으로 입력하고 CONTROL-D -l 등록된 crontab 파일의 내용을 보여준다 (list) -e 등록된 crontab 파일의 내용을 편집한다 (edit) -r 등록된 crontab 파일을 등록해제한다 (remove) userName 사용자만 자신의 crontab 파일을 소유하도록 함 crontab -l -e -r [ userName ]
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 ^D $ 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 파일의 내용 표시 $ crontab -l mysung → 사용자별로 확인하는 것은 슈퍼유저만이 사용 가능 $ crontab –r → crontab 파일의 등록 해제
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 ] at -r { jobId }+ • -r 명시된 작업을 at 큐로부터 제거 • -l 뒤따르는 작업들의 목록을 보여 줌 at -l { jobId }*
$ at 8am • at> 명령어 입력 • at> ^D • $ tty • /dev/pts/12 • $ cat at.sh • echo at done > /dev/pts/12 • $at now +1 minutes < at.sh : 스크립트가 1분 후에 수행 • $ at –l : 스캐줄 내용 표시 • $ at 17:35 < at.sh : 17시 35분에 스크립트 수행(오늘이나 내일) • $ at 0934am Jun 18 < at.sh : 6월 18일 오전 9시 34분에 스크립트 실행 • $ at 9:34 Jun 18 , 2004 < at.sh • $ at 11:00pm tomorrow < at.sh : 내일 오후 11시에 스크립트 실행 • $ at 9pm Jun 13 < at.sh : • $ at 10pm Wed < at.sh : 수요일 오후 10시에 스크립트 실행
7.9 하드 링크와 소프트 링크: In • 하드 링크 • 동일한 파일 시스템 내에서의 링크, 여러 개의 레이블 생성이 가능하나, 물리적 파일은 동일함 • 하드 링크가 추가될 때마다 링크 계수 항목이 증가 • 소프트 링크(심볼릭 링크) • 다른 파일 시스템들 간의 링크 • 링크 계수 항목이 증가하지 않고 대신에 permission에 l--- 식으로 기록됨 • ls -F 로 참조할 때 파일 이름 뒤에 @가 표시됨
ln -f -s original newLink -f 슈퍼유저가 디렉토리에 하드 링크를 생성할 수 있게 함 -s 소프트 링크로서 파일 시스템을 확장 가능 • 명시된 파일(original)들에 대한 링크를 directory에 생성 ln -f -s { original }+ driectory • $ ln hold.3 hold : 하드 링크 생성 • $ ln hold.* tmpdir : tmpdir이라는 디렉토리에 hold.* 파일의 하드링크 생성 • $ ln -s /usr/include/stdio.h stdio.h : 심볼릭 링크 생성 • $ ls -l stdio.h • lrwxrwxrwx 1 sikang 2004 20 6월 2일 19:58 stdio.h -> /usr/include/stdio.h • $ ls -F stdio.h • stdio.h@
7.10 사용자 대치 : su : 사용자 대치(substitute user) • default: root • 새로운 shell prompt; # • 사용자 대치의 종료: ^D su [-] [ userName ]
7.11 전자 우편 검사 : biff • y : 전자우편 수신 즉시 통고하도록 설정함 • n : 전자우편 수신 즉시 통고하지 않도록 함 • 아무 옵션 없이 사용하면 현재의 biff 상태를 나타내 줌 biff [ y | n ]
7.12 파일 변환 • compress/uncompress • 파일을 압축하고 다시 해독 복귀시킨다. • crypt • 키 암호를 받아들여 파일을 암호화하거나 해독한다 • sed • 스트림 편집, 하나 이상의 파일을 스캔하여 특정 조건에 맞는 모든 줄을 편집한다. 단순 반복 편집에 유용하다 • tr • 파일 내의 문자를 한 문자 집합에서 다른 문자 집합으로 변환 (transform) • ul • 밑줄 그은 문자가 명시된 터미널에 올바로 표시되도록 변환 (underline)
7.12 파일 변환 -v 압축되는 상황을 보여 줌 -c 압축된 파일로 원래의 파일을 덮어쓰지 않고 표준 출력으로 내보냄 (default: 원래의 파일을 지우고 압축된 파일 (.Z)로 치환) $ compress -v palindrom.c reverse.c $ uncompress -v *.Z compress -c -v { fileName }+ uncompress -c -v { fileName }+
crypt [ key ] < originalFile > cryptedFile 암호화 crypt [ key ] < cryptedFile > originalFile 해독화 • key가 명시되지않으면 대화식으로 물어 봄(화면에 보이지는 않음) • crypt key의 형태로 명령을 주었을 때 다른 터미널에서 ps로 체크 됨에 주의 $ crypt agatha < sample.txt > sample.crypt $ crypt agatha < sample.scrypt > sample.txt
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 : 모든 정규식 exp을 문자열 str로 대치 • address r name : address줄 뒤에 파일 name의 내용 덧붙이기 • address i\ text : address줄 뒤에 텍스트 text 삽입 • addressRange d : addressRange로 지정된 줄을 삭제 addressRange c\ text • 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 → '<<'를 줄의 맨 앞에, '>>'를 줄의 맨 뒤에 삽입함
tr -c -d -s string1 string2 string1 문자(집합)을 string2 문자(집합)으로 변환시킴 -c string1의 보어(complement)를 취함. 즉, 지정된 문자 이외의 문자들 -d string1에 있는 문자들을 표준 출력에서 제거 -s 반복 출력되는 문자를 한 번만 출력 하도록 함 • $ 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까지를 제거
% 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까지를 제거
-tterminal 터미날 유형 (/etc/termcap참조) 만일 명시되어있지 않으면 $TERM의 값을 참조 ul -tterminal { fileName }* • $ man who | ul -tdumb > man.txt • → 'who'에 관한 매뉴얼을 단순(dumb) 프린터 출력용으로 밑줄을 변환함
7.15 셸 확인 및 터미널 확인 • whoami • tty