1장 초보자를 위한 Unix
1.1 출발
단말기와 타이핑
제어문자 : ^M (Return 키) ^D (입력 완료) ^G (단말기 벨소리) ^H (후진) ^I (탭)
tty : teletype, terminal의 동의어
단말기의 이상동작
stty : set terminal options
stty -tabs
오타
return을 누르기 전 오타발생시 삭제 할 수도 있지만 @을 입력하면 이전 입력문자를 버린다. (현재는 ^U를 사용한다.)
#를 누르면 이전 입력문자 1개를 버린다. (현재의 삭제와 같다.)
우편 사용하기
mail을 사용하면 현재 사용자에게 메일을 보낼 수 있다.
write를 사용하여 terminal상의 사용자에게 message를 보낼 수 있다.
1.2 화일과 자주 쓰는 명령어
편집기 ed
a : 입력시작 append
. : 입력 종료
w filename : 파일에 저장
q : 종료
n,mp : n-m줄까지 print 하라 $는 마지막 줄
화일의 프린트 - cat and pr
cat 은 화일을 화면에 출력한다.
pr 은 프린트 가능한 형태로 보여준다.
pr -n : n개의 단으로 나누어 보여준다.
pr 과 lpr은 보통 같이 사용된다. nroff, troff 등의 프린트 명령이 있다.
유용한 명령들
wc : 단어 세기
grep : 찾기
sort : 문자 정렬
-r : reverse
-n : 숫자 순으로 정렬 -nr 도 가능
-f : 대소문자 구분 x
+n : n+1번째부터
tail : 마지막 열을 기준으로 출력
cmp file1 file2 : 차이점 비교 (대부분 같은지를 확인할 때 사용)
diff file1 file2 : 차이점 비교 (다름을 알고 어떻게 다른지 알고자 할 때 사용)
1.3 디렉토리
특별히 정리할 만한 내용이 없다.
1.4 쉘
쉘에서는 패턴을 사용할 수 있다.
패턴을 사용치 않으려면 ' 나 \를 사용하면된다.
입출력 방향전환
> : 왼쪽의 출력을 오른쪽의 입력으로 전환한다. < 는 반대
>> : 동일하나 추가의 의미
파이프
> 가 표준입력을 전달했다면 | 는 인자를 전달한다.
프로세스
& : background 로 실행하라
파이프로 연결된 명령에 & 를 사용하면 모든 명령이 동시에 background로 전환되지만 마지막 PID만이 프린트된다.
wait : & 로 시작된 모든 프로세스를 기다린다.
nohup : "no hangup" 단말기가 로그아웃이 되더라도 명령을 계속 동작시킨다. 해당 명령의 출력은 nohup.out 에 저장된다.
nice : 프로세스의 순위를 변경한다. nohup은 실행되면 nice를 사용하여 실행하는 프로세스의 순위를 낮춘다. (로그아웃할 것이므로)
at : 명령 수행 시간을 지정할 수 있다. (시간 형태 : 0000 or 0000(a|p)m
$ at 시간
명령어들...
^D
$
환경꾸미기
후진키 사용
stty erase '^h"
프롬프트 사용 (PS1 변수를 변경하면 된다.)
PS1='Prompt $'
export 변수 : 쉘에게 변수 알리기
2장 화일 시스템
Unix 시스템에서는 모든 것이 화일이다.
2.1 화일의 기본 사항
od : (octal dump) 화일의 모든 바이트를 사용자가 볼 수 있도록 한다.
od -c : 문자로 보이기
od -b : 각 바이트를 8진수로 보여준다.
개행문자에 대한 터미널의 해석
\n 은 od 같은 프로그램이 사용하는 관십의 표현이며 실제는 한 바이트인 8진수 012로 저장된다.
탭 같은 경우도 터미널이 문자를 보고 해석하여 화면에 뿌려주는데 커널이 하도록 할 수 있다. stty -tabs는 커널이 탭을 공백문자로 바꾼다.
개행문자로 마찬가지이다. 012를 캐리지 리턴과 개행으로 확장하여 출력한다. 일부 시스템(windows, joo생각)은 CRLF를 직접 파일에 입력한다. Unix에서는 사용자가 화일에 넣지 않은 어떠한 바이트도 사용하지 않는다.
2.2 화일의 내용
Unix 에서는 화일은 구별하려는 대신 화일의 차이점을 무시하려고 한다. 모든 화일은 문자와 개행문자로 구성된다. Unix에서는 화일에 접근하기 위해서는 단지 화일 이름만 알면 된다.
그러나 이것은 문제가 될 수 있다. 이진화일의 경우 개행문자 없이 수만문자가 이어져 나온다. 이 경우 Unix 프로그램은 제대로 수행되지 못한다. 한 줄에 대한 가상의 정의가 되어 있기 때문이다.
2.3 디렉토리와 화일명
pwd : 현재의 디렉토리를 알려준다.
du : 한 디렉토리 내의 모든 화일과 모든 부디렉토리가 차지하는 디스크 공간의 양을 알려준다.
2.4 접근권한
화일에 접근권한을 두어서 다른 사용자가 자신의 화일을 볼 수 없도록 할 수 있다.
su를 사용해 수퍼유저이 될 수 있다. 이 경우 모든 화일에 접근할 수 있는데 수퍼유저도 볼 수 없는 화일을 만들기 위해 crypt를 사용할 수 있다.
/etc/passwd : 로그인정보를 포함해 암호정보를 가지고 있다.
set-uid : 화일권한에 x 대신 s가 있는 것은 화일이 실행되는 순간 그 화일의 소유자의 권한이 되는 것이다. 이것은 매우 유용하지만 잘못 사용하면 보안상의 문제가 생길 수 있다.
2.5 i-노드
inode에는 세가지 시간이 있다.
최종수정시간 : 쓰여진 시간
최종사용시간 : 읽거나 수행된 시간
최종변경시간 : inode가 변경된 시간
chmod, chown
2.6 디렉토리 계층
/bin : binaries
/dev : devices
/etc : et cetera
2.7 장치
/dev 에 있는 화일은 device로 사용되지만 Unix에는 동일하게 화일로 인식된다.
3장 쉘의 사용
3.1 명령어 줄의 구조
보통은 개행문자가 명령의 끝으로 인식되지만 ; 도 명령의 끝으로 인식된다.
; 로 구분된 명령을 파이프로 보낼때는 마지막 명령의 결과만이 파이프로 보내진다.
같이 보내기 위해서는 ()로 묶어주어야 한다.
tee : 파이프로 흐르는 data를 화일로 저장하고 파이프로 그대로 흘려보낼 수 있다.
3.2 메타문자
* 과 같은 특수한 특성을 가진 문자
이들 메타문자가 해석되지 않도록 하기 위해서는 ' 로 감싸주면 된다.
줄 끝의 역슬래쉬는 그 줄이 다음줄에 계속 연결되는 것을 말한다.
echo는 명시적으로 요청받지 않아도 최종적으로 개행문자를 출력한다.
echo -n , echo "....\c" : 개행문자를 추가하지 않게 한다.
3.3 새 명령어의 생성
Unix의 여러가지 명령을 조합하여 새로운 명령을 만들 수 있다.
실행권한을 주게되면 쉘의 도움없이도 가능하다.
3.4 명령어 인수 및 매개변수
$1 ... $9 로 입력된 인자와 매개변수를 전달할 수 있다.
$* : 인자 모두를 뜻한다.
echo 'grep $* /usr/you/lib/phone-book' > 114 로 114 명령을 만들 수 있는데..
114 'john mike' 에는 실제로 mike라는 화일에서 john을 찾는 것으로 해석될 수 있다.
따라서 $* 를 "$*" 과 같이 " 로 감싸줄 필요가 있다.
$0 : 현재 수행되는 프로그램 이름이다.
3.5 인수로서의 프로그램 출력
` 로 감싼 부분은 수행된 뒤 그 결과를 반환한다.
pick : 대화식 명령이 가능하다.
3.6 쉘 변수
set : 모든 정의된 변수의 값을 알 수 있다. (몇가지를 보기위해서는 echo를 쓰는 것이 더 좋다)
HOME, PATH 등이 쉘에서 사용된다.
어떤 변수의 값을 부속쉘에서도 접근가능하게 하려면 export를 쓰면 된다.
3.7 I/O 방향전환에 대한 추가 사항
> : 표준출력을 다른 곳으로 돌린다.
2> : 표준에러를 다른 곳으로 돌린다.
2>&1 : 표준에러를 표준출력과 같은 곳으로 한다.
<< s : (here docuement) s를 맨앞에 가진 줄 직전까지의 표준입력을 취한다.
3.8 쉘 프로그램에서의 반복문 처리
for 변수 in 단어들의 목록
do
명령어들
done
for 변수 in 목록 ; do 명령어들 ; done
for i in * 과 for i in $* 은 다르게 해석된다. 파일에서 $*로 사용하면 인자를 받아서 따로따로 수행하는 것이다.
3.9 bundle : 모두 하나로 묶기
bundle은 현재 사용되지 않는다.
3.10 왜 하필이면 프로그램이 가능한 쉘인가?
쉘은 프로그램으로 처리해야 하는 여러가지 문제를 해결해주기 때문에 이를 사용하는 것이 유익하다.
4장 필터
sed : stream editor
awk : 제작자의 이름을 따서 만들었다.
4.1 grep 류
$ grep 패턴 화일명들 ...
grep, egrep, fgrep
4.2 그 밖의 필터들
sort : 입력을 줄 단위로 아스키 순으로 정렬한다.
uniq : 중복된 줄을 버린다. (-c 로 중복된 횟수를 셀 수 있다)
comm : 화일을 비교한다.
tr : 입력의 문자를 변경할 수 있다. (대소문자 변환에 흔히 쓰인다)
4.3 스트림 편집기 sed
sed 는 ed를 고쳐서 사용되었다.
$ sed 'ed의 명령어' files...
명령
's/A/B/f' : substitute A to B, f=g 이면 모두 바꿈
'y/A/B/' : A스트링을 B스트링으로 바꾸라
-f file : 패턴을 파일로부터 읽어들인다.
-n : 자동 프린트를 하지 않는다. 명시적으로 p를 사용해야 프린트한다.
'/pattern/d' : 매칭되는 줄을 삭제
4.4 패턴의 조사 처리 언어 awk
$ awk '프로그램' files ...
프로그램
pattern { action }
awk는 한번에 한 줄씩 화일명들에서 입력을 읽어들인다.
필드
awk는 각 입력 줄을 자동으로 필드로 나눈다. $1 .. $NF(마지막 필드)
-F분리자 : 분리자를 지정한다. (FS="분리자" 로도 쓸 수 있다)
프린트하기
NR : 현제 레코드번호 (= 줄번호)
printf "format" : printf 를 사용해 출력할 수 있다.
패턴
== : 같다.
~ : 문자와 부합된다.
!~ : 문자와 부합되지 않는다.
BEGIN 및 END 패턴
BEGIN { ... } : 입력을 읽기 전에 수행된다.
END { ... } : 입력을 읽은 후 수행된다.
산술과 변수 : awk의 진정한 강점은 입력 데이타에 대한 계산이 가능하다는데에 있다.
awk는 C와 동일한 산술연산을 사용할 수 있다.
awk의 내장 변수
FILENAME : 현재의 입력 화일명
FS : 필드 분리 문자
NF : 입력 레코드 내의 필드 수
NR : 입력 레코드 수
OFMT : 숫자의 출력 포맷
OFS : 출력 필드의 분리 문자열
ORS : 출력 레코드의 분리 문자열
RS : 입력 레코드 분리 문자
제어흐름
C의 문법과 비슷하나 한 명령의 끝을 개행문자로 한다.
next : 다음 입력 줄을 불러들인다.
exit : END 패턴으로 즉각 넘어간다.
배열
선언하지않고 배열이 사용이 가능하다.
awk의 내장함수
cos(expr) : cosine
exp(expr) : 지수
getline() : 다음 입력 줄을 읽고 화일의 끝이면 0, 아니면 1일 반환
index(s1, s2) : s1에서 문자열 s2의 위치, 없으면 0
int(expr) : expr의 정수부, 버림법을 사용한다.
length(s) : 문자열 s의 길이
log(expr) : 자연로그
sin(expr) : sine
split(s, a, c) : s를 문자 c를 기준으로 a[1] ... a[n]으로 분리하고 n을 반환
sprintf(fmt, ...) : fmt에 따른 포맷
substr(s, m, n) : s내의 위치 m에서 시작하는 n 길이의 문자열
연관배열 : awk는 해쉬를 이용해 연관배열을 사용한다.
문자열
a = a " " : awk에는 문자열 접합연산자가 특별히 없다. 단지 나열만으로 접합이 일어난다.
쉘과의 대화
awk에서 인자를 받기위해서는 두가지 방식이 있다.
awk '{ print $'$1' }'
awk '{ print \$$1 }'
따옴표를 사용하는 방법이 더 좋다. \가 너무 많아지면 복잡해지기 때문이다.
또한 BEGIN을 통해 자주 사용되는 부분을 변수화 해두면 복잡함을 줄일 수 있다.
4.5 좋은 화일과 좋은 필터
Unix에서 생성하는 출력은 다른 프로그램의 입력으로 쓰일 수 있다.