파일을 좀 더 잘 찾아주는 정규표현식 - *, ?, [], {}, 2>, 1>& 등
정규 표현식이란 [ ]나 { }, 그리고 *과 ?와 같은 부호를 사용해서 명령어 실행을 간략히 빠르게 처리하는 방법인데, 정규 표현식으로 많은 파일과 문장을 편리하게 조작하게 해준다. 쉘 스크립트나 데이터베이스 SQL 쿼리, Python, C, JAVA 등에서도 자주 사용된다.
필요한 부분만 추출해서 보이는
- cut
cut는 출력의 일부분만 보이게 한다. 이 명령어에서는 -d와 -f 옵션이 잘 사용되는데
d : 줄을 열(column)의 형태로 보이게 하는데 열에 분리자(delimiter나 separator로 Tab, Space, ,, :, # 등)를 " " 안에 지정할 수 있음
f : 어느 열을 보일지 지정함 등이다.
파일을 비교해주는
- cmp와 comm
▪ cmp는 두 파일을 비교해서 차이 여부를 알려주는 명령어이다. 예를 들어서 해킹이 있은 후 기존에 설정해둔 중요 파일에 변경이 있는지 의심스런 경우 백업해둔 이 파일과 현재 이 파일을 비교해서 변경 여부를 확인하는데 사용될 수 있다.
▪ comm도 cmp와 유사하게 두 파일에서 유일한 부분과 공통적인 부분을 열로 구분해서 보인다. 1열은 첫 번째 파일에서 유일한 것들, 2열은 두 번째 파일에서 유일한 것들, 그리고 3열은 두 파일에서 공통된 것들이 각각 세로 줄로 표시된다.
정규표현식 패턴으로 검색해주는 – grep, fgrep(grep -F), egrep(grep -E)와 pgrep
정규 표현식에서는 원하는 패턴을 잘 짜는 것이 중요한데 수십 ~ 수백 줄 파일을 열고 일일이 원하는 것을 찾아서 수정해야 하는 경우 간단히 한 줄의 명령어로도 해낼 수 있기 때문이다.
패턴 설명
[aeiou] a, e, i, o, u 중 어느 문자라도 들어있는 어구
[a-z] a부터 z 사이의 문자가 들어있는 어구. 알파벳 소문자
[a-z][A-Z] a부터 z 사이와 A부터 Z 사이의 문자가 들어있는 어구. 알파벳 대소문자
[0-9] 0부터 9 사이의 숫자가 들어있는 어구
^[ ], [^ ] ^[ ]는 [ ] 내용으로 시작됨, [^ ]는 [ ] 내용의 부정 <= ^[^#$]
^pattern 주어진 패턴으로 시작되는 줄 <= ^#
pattern$ 주어진 패턴으로 끝나는 줄. 단독으로 $를 쓰면 빈 줄 <= #$
^[a-z][0-9]$ 시작은 a부터 z 사이의 문자, 끝은 0부터 9사이의 숫자인 줄
[.], [...] .는 임의의 문자 1개, ...는 임의의 문자 3개 <= [a...e]
pattern+ 이전 패턴과 하나 이상으로 매치되는 어구 <= root+
pattern* 이전 패턴과 매치되지 않는 어구 <= root*
pattern? 이전 패턴과 하나만 매치되는 어구 <= root?
(abc)+ 'abc' 패턴과 하나 이상으로 매치되는 줄. +는 적어도 하나 이상을 의미
()는 여러 정규 표현식을 하나로 묶기도 한다
v 부정의 의미 <=v ~#는 #이 없는 줄을 보임
c 갯수를 표시 <=c ~#는 #이 있는 줄의 갯수
| 두 개의 정규 표현식에서 OR 의미
{n}, {n,m} 지정된 정규 표현식에 n번 일치, 최소 n에서 최대 m번 일치
[: ~ :] 클래스
[:alnum:] alnum은 영문이나 숫자와 일치
[:alpha:] alpha는 영문자와 일치
[:digit:] digit는 숫자와 일치
[:punt:] punt는 구두점(, . )과 일치
■ grep는 패턴을 이용해서 파일을 서치하는데 사용되며 |와 함께 |grep식으로 사용되면 좌측의 출력에서 원하는 결과만 걸러내는 필터링(filtering) 역할을 한다.
=>[a-e]는 {abcde}로써 a,b,c,d,e 중 하나이고,
[ak]는 a나 k중 하나,
^a는 a로 시작,
a$는 a로 끝남,
v #은 #이 없는 줄 보임,
c #은 #이 있는 줄의 개수를 나타낸다.
■ fgrep는 여러 파일에서 문자열을 빠르게 검색할 때 사용하는데 grep –F 와 동일하다.
■ pgrep는 PID(Process ID)를 보는 명령어인데,
■ egrep도 패턴으로 검색해주는데 grep –E 와 동일하다. E는 Extended의 의미
grep -n ^[^#$] /etc/httpd/conf/httpd.conf 하면 주석#과 빈 줄로 시작되지 않는 실제 내용만 줄 번호를 붙여서 보임
=> ^[ ]는 부정의 의미가 있다.
파일에서 문자열을 변환시키는 - tr
tr 명령어는 앞에서도 잠시 사용해 보았는데 여기서 class [: ~ :]를 설명하기 위해서 좀 더 알아본다. 'tr -옵션 set1 set2 대상_파일'형식을 사용해서 대상_파일에서 set1을 set2로 변경시킨다. 단독으로 쓰이거나 '| tr ~ 패턴'으로 사용된다.
[: ~ :] 클래스에는 alnum(문자+숫자), alpha(문자), blank(빈칸), digit(숫자), lower(소문자), upper(대문자), print(보이기), space(빈칸), special(특수문자), xdigit(16진수) 등을 넣을 수 있다. 여러 클래스를 쓸 때에는 [] 와 [] 사이에 한 칸씩 띄우고 나열하면 된다.
패턴 검색과 처리를 위한
- awk
이 명령어는 앞에서 사용했던 cut 명령어와 유사한데 'awk {action $컬럼} 파일_명' 형식이다. action은 주로 화면에 띄우는 print를 사용하고 컬럼은 $0, $1, ...식으로 지정한다. 이 awk는 Bash Shell 스크립트에서 불러서 사용할 수 있다.
파일을 편집해서 보이는
- sed
sed(stream editor)
sed는 파일을 갈무리해서 보이는데(변경도 가능) 한 줄씩 읽어서 작업을 수행하기 때문에 버퍼 메모리를 적게 사용해서 큰 파일을 다룰 때 유용하다. 'sed [option] 명령어 파일_명' 형식으로 여러 옵션과 복잡한 구문을 가지고 있지만 잘 사용하면 정말 강력한 편집기이다.
∎ ^, ;, #, @, ... 등이 문자/특수기호라는 것을 표시하기 위해서 문자 전후에 / 를 넣는다.
∎ ^는 처음, $는 끝, . 는 어느 한개 문자와 일치, *는 어느 임의의 개수의 문자/숫자와 일치, \는 정규표현식, [abc]는 a, b, c 중 어느 문자와도 일치, ![abc]는 a나 b나 c 어느 문자와도 불일치, !는 선택된 줄 제외, /a./는 a로 시작되는 2 문자, /a.../는 a로 시작되는 4 문자를 나타낸다. /^#/은 주석#으로 시작되는 줄, /^root/는 root라는 단어로 시작되는 줄, /root$/는 root라는 단어로 끝나는 줄, /^$/는 공백 줄을 의미한다.
∎ [패턴]/p는 해당 패턴출력, [패턴]/d는 해당 패턴삭제, s/문자1/문자2/는 패턴에서 처음 보이는 문자1을 문자2로 대체(substitude), s/문자1/문자2/g는 문자1을 문자2로 모두 대체(/g는 모든 줄에 적용), /i는 대소문자 무시, n은 출력만 해줌(주로 p 옵션과 같이 사용), f는 파일지정, e는 변경해서 보이기만 함, i는 새로운 패턴으로 변경해서 파일로 저장 등의 옵션도 있다.
1) head –5 /root/initial-setup-ks.cfg | cat –n 해보고,
2) 단어/어구 변경은 's/바뀔_단어/바꿀_단어/' 형식이다.
sed -e 's/System/SYSTEM/g' /root/initial-setup-ks.cfg | head
=>모든 System이 SYSTEM으로 변경됨
sed -e '1,5s/System/SYST/g' /root/initial-setup-ks.cfg | head
=>1~5줄 내에서만 SYSTEM이 SYST로 바뀜
sed -e 's/SYSteM/SYSTEM/gi' /root/initial-setup-ks.cfg | head
=>대소문자 무시하고 SYSteM을 SYSTEM으로 바꿈
=>sed -e 's/[Ss]ystem/SYSTEM/g' /root/initial-setup-ks.cfg | head과 같음
3) 단어/어구 삭제는 '패턴/d' 형식이다.
sed -e 's/System/(빈칸)/gi' /root/initial-setup-ks.cfg | head
=>System만 삭제
sed -e 'd' /root/initial-setup-ks.cfg | head
=>모든 줄을 삭제하므로 아무 것도 보이지 않는다.
sed -e '4d' /root/initial-setup-ks.cfg > /root/initial-setup-ks.cfg.bak
=>4번째 줄을 지우고 initial-setup-ks.cfg.bak으로 저장한다.
=>sed -i '4d' /root/initial-setup-ks.cfg 한 것과 동일하다.
=>diff /root/initial-setup-ks.cfg /root/initial-setup-ks.cfg.bak 해서 차이 나는 곳을 본다.
sed -e '3,$d' /etc/passwd | head
=>3줄부터 끝줄까지 삭제
sed -e '1,10d' /etc/passwd | head
=>1~10줄까지 삭제
sed -e '/^#/d' /etc/httpd/conf/httpd.conf | head -20
=>주석#으로 시작되는 줄만 삭제. ^#이 부호라는 의미로 전후에 /~/을 붙였다.
sed -e '3,7s/sbin/(빈칸)/g' /etc/passwd | cat –n
=>3~7줄에서 sbin만 삭제
sed -e '/^$/d' /etc/httpd/conf/httpd.conf | cat –n
=>공백 줄만 삭제
sed -e '/^$/!d' /etc/httpd/conf/httpd.conf | cat –n
=>공백 줄만 삭제하지 않음
sed -e '3,7d' /etc/passwd | head | cat –n
=>3~7줄만 빼고 보임
sed -e '/root/d' /etc/passwd | cat –n
=>root가 포함된 줄만 삭제
sed -e '/^#$/d' /etc/httpd/conf/httpd.conf | sed -e '/^$/d' | cat –n
=>주석#과 빈 줄을 모두 삭제
=>sed -i '/^$/d' /etc/httpd/conf/httpd.conf && sed '/^#/d' /etc/httpd/conf/httpd. conf && cat -n /etc/httpd/conf/httpd.conf
=>빈 줄과 주석#을 제외하고 저장함
몇 줄 안으로 들여쓰기 # 줄을 지운다면
sed '\/#/d' /etc/httpd/conf/httpd.conf 식으로 하면 된다.
=>sed '/^[*]#/d' /etc/httpd/conf/httpd.conf 해도 된다.
파일을 분할해주는 – split
옵션 없이 'split 파일1 파일2'하면 큰 파일1을 디폴트로 1,000줄씩 잘라서 파일2aa, 파일2ab, ...파일2az, 파일2ba, ...식으로 나눠서 저장한다. 옵션으로
b : byte 단위로 자름
l : 줄 단위로 자름 등이 있다.
텍스트를 정렬해서 보이는 – sort
파일의 내용을 정리할 때 사용되는 명령어가 sort인데 옵션으로
b : 첫줄 빈칸 무시하고 정렬
f : 소문자를 대문자로 정렬
n / r : n은 디폴트인 오름차순으로 정렬, r은 내림차순으로 정렬
소유권(ownership)과 허가권(permission)
Linux 시스템에 있는 모든 파일과 디렉터리에는 액세스할 수 있는 사용자를 지정하는 소유권과 엑세스해서 작업할 수 있는 범위를 지정하는 허가권이 있다. 소유권은 디폴트로 해당 파일과 디렉터리를 생성한 사용자의 소유로 계정이름이나 UID로 표시된다.
파일과 디렉터리에 대한 속성 확인은
∎ 파일은 ls –l /etc/passwd식으로 하고,
∎ 디렉터리는 ls –dl /home/centos식으로 하면 된다.
허가권(권한) 변경 - chmod
허가권은 파일의 소유자(owner), 지정된 사용자들이 들어 있는 그룹(group), 기타 누구라도(other) 액세스하도록 설정할 수 있다.
문자식 변경은 파일의 소유자, 그룹, 그리고 타인에게 각각 읽기(r), 쓰기(w), 실행(x) 권한을 chmod 명령어에 +로 부여할 수 있고, -로 권한을 뺏을 수 있다. 여기에서의 실행(x)은 실제 파일을 실행시킬 수 있는 권한을 말하고, 파일이나 디렉터리를 변경할 수 있는 권한은 쓰기(w)이다.
수치식 변경은 7(rwx)에서 r(4), w(2), x(1)을 조합해서 파일의 소유자, 그룹, 그리고 타인에게 각각 줄 수 있다.
=>새롭게 파일/디렉터리를 생성하면 기본적인 권한은 파일은 666, 디렉터리는 777 권한에서
umask(/etc/bashrc OR /etc/profile에 지정)에 지정된 값을 뺀 값으로 지정된다.
따라서 이 디폴트 umask 값은 /etc/bashrc 파일에서
68줄 umask 022 기본 값을 다른 수정해주면 이후로 생성되는 파일의 기본 권한(644)이나 디렉터리의 기본 권한(755)의 속성이 바뀌게 된다.
=>실제 설정에서 777이 0777이나 666이 0666, 022를 0022식으로 3자리가 아니라 4자리로 표시되는 경우가 있는데 이는 setUID(4000), setGID(2000), 그리고 Stickybit(1000)을 포함한 개념일 때 이렇게 쓴다. 맨 앞의 0이 되면 SetUID(4), SetGID(2), Stickybit(1)가 설정되지 않았다는 뜻이다.
-R : 하위 디렉터리까지 모두 변경 옵션만 알고 있으면 된다.
소유권 변경 - chown
작업하기 위해서 때로는 사용자 A가 만든 a 파일/디렉터리를 사용자 B로 소유권을 변경시켜서 B가 a 파일/디렉터리로 작업하게 하거나, 그룹을 변경해서 해당 그룹에 있는 여러 사용자들이 a 파일/디렉터리로 작업하게 해주는 경우가 많다. 소유권 변경은 보안과 관련되어 있으므로 root가 해주어야 한다.
-R : 하위 디렉터리가지 모두 변경 옵션만 알고 있으면 된다.
사용자 A의 소유권으로 되어 있는 a 파일/디렉터리를 다른 사용자 B에게 줄 때
a. 'B:B'(OR 'B.B' OR 'B:') a 하면
=>a 파일/디렉터리의 소유자와 그룹이 모두 B가 된다.
b. ':B'(OR '.B') a 하면
=>a 파일/디렉터리의 그룹만 B로 변경된다.
c. 'B' a 하면
=>a 파일/디렉터리의 소유자만 B로 변경된다(이 경우 'B:' a 하면 안 된다).
특수 파일
Linux 시스템에서는 모든 하드웨어 장치도 하나의 파일로 인식하므로 다양한 파일형식이 있다. Linux에서 특수파일은 block device, link, character, named pipe, 그리고 socket 파일이 있는데 mknod 명령어에 b, c, p, s 옵션을 붙여서 실행하면 생성된다.
참고로 통신에서 동기식/비동기식이라는 용어가 자주 나오는데
◾ 동기식(synchronous)은 송신자가 동의한 시간 동안만 데이터를 전송하는 방식으로 별도 로 송수신자 양측이 클럭(clock)으로 동기신호를 맞추어야 한다. 문자나 비트단위로 전송하며, 정확한 고속 데이터 전송이 가능하지만 사용 장비가 고가이다.
◾ 비동기식(Asynchronous)은 필요할 때마다 그때그때 데이터를 전송하는 방식으로 송수신 자가 데이터 송수신을 동의할 필요가 없는 방식이다. 송신자가 전송 데이터 안에 전송 시 작(start)과 전송 종료(stop) 비트를 넣어서 송신을 알린다. 문자단위로 저속으로 전송하 기 때문에 사용 장비가 저가이며, 임의로 데이터를 송수신할 때 편리해서 특정 송수신을 제외하고 대부분 통신에서는 이 비동기식 송수신 방법을 사용한다.
(Named) pipe
일반적인 Bash Shell은 동일한 쉘(GUI에서 tty 해서 보면 /dev/pts/0식으로 보이고, CLI에서 tty 하면 /dev/tty0식으로 보임) 내에서 작동되는 프로세스들을 처리하므로
cat /etc/passwd | tail -3과 같은 명령어를 pipe로 수행하면 | 앞의 cat ~ 명령어와 | 뒤의 tail ~ 명령어가 동일한 쉘 안에 있으므로 나중 프로세스인 두 번째 명령어의 실행 결과만 콘솔에서 나오게 된다. | 앞의 cat ~ 명령어 부분은 메모리에 저장되어져 있다. 이 메모리에 들어있는 정보를 다른 콘솔에서 보게 하는 방식이 명명된 파이프이다.
따라서 Named pipe는 서로 다른 쉘(콘솔을 두 개 열어두면 /dev/pts/0과 /dev/pts/1이 됨)끼리 프로세스가 연결되게 한다.
cat /etc/passwd | tail –3(예로써 보인 것일 뿐이다!!)과 같은 명령어를 수행하면 cat 명령어를 수행한 쉘(/dev/pts/0)에서의 결과가 tail 명령어를 실행하는 쉘(/dev/pts/1)로 전해져서 쉘 간의 정보연결이 가능하다. 이들 과정은 표준입력(0> &), 표준출력(1> &), 그리고 표준에러(2> &)와 관련이 있다.
두 프로세스 사이의 통신은 오직 named_pipe를 통해서 이뤄지고 이 named_pipe 정보가 외부로 노출되지 않기 때문에 게임이나 채팅에서 상대방에 대한 정보를 직접적으로 알 수 없는 것이다!!!
socket file
소켓장치 파일은 A 응용 프로그램의 정보를 B 응용 프로그램에게 전해줄 때 사용된다. 예를 들어 프린팅 데몬인 CUPS(Common UNIX Printing System)가 실행중일 때 워드 프로그램에서 인쇄를 한다면 워드 프로그램이 CUPS 데몬이 실행되고 있는 소켓 장치(파일)에게 인쇄 작업을 요청하고 CUPS 프린터 데몬이 이 요청을 받아서 처리하게 된다.
temporary file
임시파일은 어느 응용 프로그램이 실행되는 기간 동안만 필요에 의해서 존재하는 파일로써 해당 응용 프로그램의 실행 결과를 임시로 저장했다가 해당 프로그램 실행이 끝나면 버려지게 된다. 이런 임시 파일이나 디렉터리는 보통 /tmp 디렉터리에 저장된다. root가 작업하고 끝내면 해당 작업의 임시 파일은 root 권한을 가지고 있기 때문에 보안 상 주의해야 하는데 작업 후에 바로 삭제하는 습관이 있어야 한다.
임시파일을 임의로 name.XXX식으로 생성할 수 있는데, 여기서 name은 임시파일 이름이고, XXX는 문자의 길이이다. mktemp test.XXXXXX식으로 생성한다.