블로그 이미지
인터넷 해외선교를 기본으로 하는 개인적 내용과 학점은행제 관련한 것을 한꺼번에 남겨볼께요. 항상 행.복.하시길~ 주문처럼 외우는 엠토리가 운영하는 블로그입니다
엠토리

공지사항

최근에 올라온 글

최근에 달린 댓글

글 보관함

calendar

1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
조금 길어요 ^^; 진도를 맞추는 게 좋다는 생각에 이틀치 수업 내용을 한꺼번에 올립니다 ㅎ

☞리눅스 운영체제는 퍼미션과 소유권을 통해 다른 사용자들로부터 자신이 만든 파일을 보호할 수 있다.
☞관리자는 퍼미션과 소유권을 통해 일반사용자들의 파일 (또는 디렉토리)에 대한 접근을 제어할 수 있다.

<파일관리 : 퍼미션(Permission), 소유권(Ownership)>

1.리눅스는 여러 사람이 사용하는 다중사용자 운영체제이므로 각 파일이나 디렉토리에 대해서 퍼미션(허가권)과 소유권이 존재한다.
2.리눅스에서는 파일의 확장자로 실행파일을 구분하지 않는다. 실행가능 파일은 ls 했을 때 green 컬러로 표시된다. (디렉토리는 blue 컬러, 심벌릭링크파일은 skyblue 컬러)
3.파일은 퍼미션과 소유권을 갖는다.
4.대소문자를 구분한다.
5.파일이름은 255자 까지 가능하고 공백이나 특수문자도 포함할 수 있다. (공백이나 특수문자, 한글 사용은 권장하지 않는다. 영문과 숫자, _ 등을 조합해서 사용하는 것을 권장)
6.파일의 종류는 ls -F 로 확인할 수 있다. (실행파일은 *, 디렉토리는 /, 심벌릭링크파일은 @ 가 파일명뒤에 표시된다.)

#mkdir  /work/boot
#ls -F /work
boot/(--->디렉토리)    kkk.txt    linux2.txt  php-5.2.4.tar.gz  zip-2.3-27.i386.rpm
hello.c  hello.exe*(--->실행파일) linux.txt  services

#ls -F /bin 
alsaunmute*(--->실행파일)
arch*
ash*
ash.static*
aumix-minimal*
awk@(--->심벌릭링크파일)
basename*
bash*
bsh@
cat*

파일 또는 디렉토리 퍼미션 변경 : chmod(Change Mode)
(파일 소유자나 루트만이 사용할 수 있다.)
 -R 옵션 : 하위 디렉토리 및 파일을 모두 변경할 때 사용

권한을 가지는 개체-user, group, others
u user 소유자(사용자)
g group 그룹(사용자들을 묶을수 있는 개체, 학교의 동아리, 회사의 부서)
o ohers 다른 계정들(everyone)
a all(3 개체를 모두 가리킴)

+ 권한 추가 
- 권한 제거
= 새로 권한 지정

예)
chmod  ugo+rx  my.txt (---> chmod  a+rx  my.txt 와 동일하다.)

◆기본권한(permission)
r   read      4 (읽기)
w  write     2 (쓰기)
x  execute  1 (실행)

7 rwx
6 rw-
5 r-x
4 r--
3 -wx
2 -w-
1 --x
0 ---
(권한이 없을 때는 - 로 표시)

◆special permission
4000 setuid      실행시 소유자 권한을 갖는다.
2000 setgid      실행시 그룹 권한을 갖는다.
1000 sticky bit  공용 디렉토리에 설정해서 소유자와 루트만이 파일을
                     삭제할 수 있도록 설정할 때 사용한다.

예)
chmod  4755  my.exe  (setuid 설정)
chmod  u+s   my.exe  (setuid 설정)
chmod  g+s   my.exe  (setgid 설정)

소유자 변경 : chown(Change Owner)
그룹   변경 : chgrp(Change Group)
               -R 옵션(디렉토리 일 때 하위 디렉토리 및 파일 모두 변경할 때 사용)

◆r, w, x 의 의미
 1. r (read)
   파일      : 파일의 내용을 볼 수 있다.
   디렉토리 : 디렉토리의 내용을 ls 로 볼 수 있다.
 
 2. w (write)
    파일      : 파일을 수정할 수 있다.
    디렉토리 : 디렉토리의 내용을 변경할 수 있다.
    (파일을 삭제할 수 있는 권한은 파일의 w 권한이 아니고 그 파일이 있는 디렉토리에 w 권한이 있어야 파일이 삭제된다.)

 3. x (execute)
    파일      : 파일을 실행할 수 있다.
    디렉토리 : 디렉토리 안으로 cd 를 이용하여 들어갈 수 있다.

---> 퍼미션과 소유권은 일반 계정들에 대해서는 정확하게 적용되고 수퍼유저인 루트는 실행권한 만 빼고 퍼미션과 소유권을 초월한다. (루트라 할지라도 파일에 실행권한이 있어야 실행할 수 있다.)

[cent]
#cd  /work
(디렉토리 이동이 안되면 #mkdir  /work 한 후 이동)

#ls
hello.exe

//////////////////////////////////////////////////////
hello.exe 파일이 없을 경우
#vi  hello.c

#include  <stdio.h>
int  main()  {
     printf("Linux  Test  \n");
     return  0;
}

#gcc  -o  hello.exe  hello.c
실행한 후 실습하기
//////////////////////////////////////////////////////

#ll hello.exe
-rwxr-xr-x  1 root root 4725 Aug  7 14:42 hello.exe
  7  5  5
퍼미션 : 하드링크수 : 소유자 : 그룹 : 크기(바이트) : (수정)날짜 : 파일명

퍼미션 -rwxr-xr-x 에서 첫번째 문자가 - 이면 일반파일이고 d 이면 디렉토리이다. 나머지 문자는 3개씪 묶어서 소유자(User), 그룹(Group), 다른계정들(Others) 의 퍼미션을 뜻한다.

rwx=>4+2+1=>7
r-x=>4+0+1=>5

#chmod  u-x,g-x,o-rx  hello.exe
u-x,g-x,o-rx 사이에 공백이 있으면 안 된다.

u-x,g-x,o-rx 의 의미
user   퍼미션에서 실행권한 x 제거
group  퍼미션에서 실행권한 x 제거
others 퍼미션에서 읽기 및 실행권한 rx 제거

#ll hello.exe
-rw-r-----  1 root root 4725 Jun  5 20:41 hello.exe

#./hello.exe
-bash: ./hello.exe: Permission denied

원하지 않은 프로그램을 실행시킬수 있으므로 루트라 할지라도 실행권한이 없으면 실행할 수 없다.

#chmod 755 hello.exe
user 개체에 7, group 개체에 5, others 개체에 5 퍼미션 할당

#ll hello.exe
-rwx r-x r-x  1 root root 4725 Jun  5 20:41 hello.exe
  7   5   5 

r  - 4
w - 2
x  - 1

-rwxr-xr-x 에서 첫번째 글자가 d 이면 디렉토리, - 이면 파일, l 이면 링크파일(다른 파일과 연결되어 있다는 의미), b 는 블록장치, c 는 캐릭터 장치를 뜻한다.

#chmod a-x hello.exe
#ll hello.exe
-rw- r-- r--  1 root root 4725 Jun  5 20:41 hello.exe
  6   4   4

[root@cent work]# chmod ugo=rx hello.exe
[root@cent work]# ll hello.exe
-r-xr-xr-x  1 root root 0  2월 12 01:26 hello.exe

#chown  nobody  hello.exe
파일의 소유자 변경
#ll hello.exe
-rw-r--r--  1 nobody root 4725 Jun  5 20:41 hello.exe

#chown  nobody111  hello.exe
chown: `nobody111': 잘못된 사용자
#
---> chown, chgrp  명령어 다음에는 
/etc/passwd, /etc/group 에 등록되어 있는 사용자, 그룹이름을 적어야 한다.

/etc/passwd : 리눅스 사용자가 등록되어 있는 파일
/etc/group  : 리눅스 그룹이 등록되어 있는 파일
/etc/shadow : 리눅스 사용자의 패스워드(암호)가 있는 파일

#chgrp  sys  hello.exe
파일의 그룹 변경
#ll  hello.exe
-rw-r--r--  1 nobody sys 4725 Jun  5 20:41 hello.exe

nobody 와 sys, adm 은 리눅스 설치시 자동으로 등록되는 시스템 계정(사용자)과 시스템 그룹이다.

#chown  root.adm  hello.exe
또는 #chown  root:adm  hello.exe 
소유자와 그룹 동시에 변경

#ll hello.exe
-rw-r--r--  1 root adm 4725 Jun  5 20:41 hello.exe

◆setuid
로그인한 사용자와 관계없이 프로그램을 실행할 때 그 프로그램의 소유자 권한으로 실행되는 특별한 권한, 주로 루트 소유자로 되어있는 프로그램에 설정되어 있다.

[cent]
#ll /etc/shadow
-r--------  1 root root 1170 Jun 10 21:14 /etc/shadow
(/etc/shadow 파일은 루트만 접근 가능하다.)

#which passwd
/usr/bin/passwd

#ll /usr/bin/passwd
-r-s--x--x  1 root root 18852 Mar  7  2005 /usr/bin/passwd
--->setuid 가 적용되어 있다.

◆테스트 계정 생성하기
[cent]
adduser : 새로운 계정(사용자)을 생성시키는 명령

#adduser  apple
--->apple 사용자 생성

#passwd apple
1234
1234

--->apple 사용자의 암호 설정 (입력시 아무것도 안 보이므로 정확히 타이핑하고 엔터를 누르면 된다.) 루트일 때는 짧은 암호를 설정할 수 있다.


putty : 원격 접속 프로그램

[win7]-----------<가상 네트워크>------------------[cent]

[putty]
win7 에서 cent 로 apple 로그인

putty 실행후 HostName(or IP Address) 항목에 리눅스의 아이피를 입력후(#ifconfig 로 확인) Open 버튼을 누른후 메시지 창(Warning)이 나오면  예(Yes) 를 누른다.

login as: apple
apple@192.168.197.128's password: apple 사용자의 암호입력
[apple@cent ~]$

id : 사용자 확인 명령

$ id
uid=500(apple) gid=500(apple) groups=500(apple)

$cat  /etc/passwd (사용자 계정이 등록되어 있는 파일)
---> O
$cat  /etc/shadow (사용자 암호가 등록되어 있는 파일)
---> X

$ ll /etc/passwd  /etc/shadow
-rw-r--r--  1 root root 1841 12월 11 02:43 /etc/passwd
-r--------  1 root root 1170  3월 15 07:14 /etc/shadow

$ cat /etc/shadow
cat: /etc/shadow: 허가 거부됨
한글이 깨지면 #export  LANG=C 를 입력해서 영문설정하고 테스트

$ passwd
Changing password for user apple.
Changing password for apple
(current) UNIX password: 1234(apple 의 현재 패스워드 입력)
New UNIX password: qwer ---> 일반계정은 간단한 암호를 사용할 수 없다. (루트는 지정할 수 있다.)
BAD PASSWORD: it is too short
New UNIX password: qwer1234 (일반 계정은 8자 이상으로 암호를 지정)
Retype new UNIX password: qwer1234
passwd: all authentication tokens updated successfully.
---> passwd 명령어에 setuid 가 있어서 /etc/shadow 파일이 업데이트 된다. (setuid 로 인하여 일반계정도 자신의 암호를 변경할 수 있다.)

[cent]
(루트 계정으로 작업-프롬프트가 # 상태)
#ll  /usr/bin/passwd
-r-s--x--x  1 root root 21200  8월 22  2005 /usr/bin/passwd
--->실행권한이 없는 상태에서는 소문자 s 가 아니라 대문자 S 로 나타난다.

#chmod  u-s  /usr/bin/passwd
(setuid 제거)

#ll  /usr/bin/passwd
-r-x--x--x  1 root root 21200  8월 22  2005 /usr/bin/passwd


[putty]
(apple 계정으로 작업-프롬프트가 $ 상태)
$ passwd
Changing password for user apple.
Changing password for apple
(current) UNIX password: qwer1234 입력
passwd: Authentication token manipulation error

---> passwd 명령어에서 setuid 를 제거하면 일반계정은 암호를 업데이트 할 수 없다.


◆passwd 권한 원래대로 설정하기

[cent]
(루트 계정으로 작업하기)
#ll  /usr/bin/passwd
#chmod  u+s  /usr/bin/passwd
#ll  /usr/bin/passwd

---> setuid 를 다시 설정하고 putty 에서 apple 의 암호를 변경할 때 안 되면 루트 계정에서 apple 의 암호를 다시 설정(#passwd  apple)하고 테스트 해 본다. (setuid 를 제거하고 실행해서 오동작 할 수 있다.)


◆sticky bit
setuid 와 setgid 는 일반적으로 디렉토리가 아니라 루트 소유자로 된 실행가능한 프로그램에 지정하고 sticky bit 는 파일보다 디렉토리에 지정한다.

[cent]
#adduser  banana
#passwd  banana
암호지정
1234
1234
#passwd  apple
1234
1234

#ls -l /

drwxrwxrwt   12 root root   4096 Jun 10 21:38 tmp
---> sticky bit 가 설정되어 있다.(1777)


[putty]
apple login
$cd  /tmp
$touch  apple2.txt
$ll
-rw-rw-r--  1 apple apple    0 12월 12 00:34 apple2.txt

$su  banana
---> banana 계정으로 전환
Password: banana 계정의 암호 입력

$id
uid=501(banana) gid=501(banana) groups=501(banana)

$pwd
/tmp

$ll
total 36
-rw-rw-r--  1 apple apple    0 Jun 10 22:19 apple2.txt

$rm apple2.txt
rm: remove write-protected regular empty file `apple2.txt'? y 입력
rm: cannot remove `apple2.txt': Operation not permitted

$ls
apple2.txt    keyring-MYtKrn  orbit-root      texconfig.hn4867  xses-root.FNdhQx
gconfd-root  mapping-root    ssh-gcvrCQ2178  tmp.noIJGa2325

---> sticky bit 로 인하여 다른 계정이 만든 파일이 지워지지 않는다. 디렉토리 퍼미션이 777 이라면 다른 계정이 만든 파일을 지울수 있다.
파일을 삭제할 때는 파일의 w 권한이 적용되는 것이 아니고 그 파일이 속한 디렉토리의 w 권한이 적용된다. 
파일의 w 권한은 파일의 내용을 수정할 수 있다는 의미이다.
sticky bit 는 주로 공용 디렉토리(인터넷 게시판에 해당)에 설정하며 루트나 파일 소유자만이 해당 파일을 삭제할 수 있다.


<일반 계정에서 루트 또는 다른 계정으로 전환하기>
su : Switch User

관리자도 일반 계정으로 사용하다가 루트 권한이 필요한 경우 su 를 이용하여 루트 로 전환하기 위해서 사용되며 테스트 할 때 A 계정에서 B 계정으로 전환할 때도 이용된다.

1. 루트 계정으로 전환
   1)su   (su    root 와 동일)
   2)su - (su  - root 와 동일)

2. 다른 계정으로 전환
   1)su     계정명
   2)su  -  계정명

su 다음에 
- 를 사용하면 모든 쉘설정파일을 읽어서 로그인한 것과 비슷하게 되고
- 가 없으면 모든 쉘설정파일을 읽지 않아서 일부 환경변수는 이전 계정의 내용으로 존재한다.
이전 계정으로 돌아올 때는 #exit 하면 된다.
putty 접속을 종료할 때도 #exit 를 입력하면 된다.

◆실습
1.cent 에서 루트계정으로 /tmp2 디렉토리 생성후 디렉토리 퍼미션을 777 로 설정하기
2.putty 이용하여 apple 로 로그인한 다음 /tmp2 로 이동해서 apple.txt 만들기
3.su 이용하여 banana 로 전환후 /tmp2 로 이동해서 apple.txt 삭제 테스트 하기
//////////////////////////////////////////////////////
[cent]
#mkdir  /tmp2
#chmod  777  /tmp2
#cd  /
#ll 로 확인
[putty]
apple login
$cd  /tmp2
$touch  apple.txt
$su  banana
$id
$ls
$rm  apple.txt (삭제 테스트)
질문에 y 를 입력해야 삭제됨
//////////////////////////////////////////////////////


◆Control 문자
키보드 컨트롤 키(Ctrl)와 문자를 이용하여 특별한 기능을 사용할 수 있다.

Ctrl + c 명령 실행 중단
Ctrl + d 입력 종료
Ctrl + u 터미널 입력 라인 초기화
Ctrl + w 터미널 마지막 입력단어 삭제
Ctrl + s 터미널 출력 중지
Ctrl + q 터미널 출력 재시작


◆파일 및 경로명 확장
* : 모든 문자를 의미
? : 한 문자를 의미
[...] : [ ] 안의 한 문자를 의미, ^ 는 제외를 의미
{파일1,파일2,...} : { } 안의 파일을 묶어서 사용할 때

#mkdir  /work2
#cd  /work2
#touch  a  ab  tb  abc  a.txt  ab.txt  abc.txt
#ls  *
#ls  *.txt
#ls  ab*
#ls  ?
#ls  ??
#ls  ?.txt
#ls  ??.txt
#ls  [abc]
#ls  [abc]b
#ls  [^abc]b
#ls  -l  /etc/{hosts,services}
#cd  /
#ls
tmp  tmp2
#cd  tm??
#pwd
tmp2



리눅스 명령어(grep,find)

<Pipe(파이프)>

#명령어1 | 명령어2 | 명령어3 ...

| ---> 백스페이스 왼쪽키

파이프(|) : 리눅스 명령어들을 연결해서 사용할 수 있는 기호
       파이프를 이용하면 한 명령어의 출력을 다른 명령어의 입력으로 사용하여 여러 명령어가 적용된 출력 결과를 얻어낼 수 있다.
      A | B | C ...

명령어1 의 결과 ---> 메모리 임시버퍼에 저장 ---> 명령어 2 의 입력

grep 명령어(필터링)
파일내에서 특정 패턴을 검색하여 그 패턴을 포함하는 모든 라인을 화면에 출력하는 명령어
특정 패턴을 찾는 규칙을 정규표현식(Regular Expression)이라 한다.

-------------------------------------------------
^ 시작을 의미
-------------------------------------------------
$ 끝을 의미
-------------------------------------------------
. 한 개의 문자를 의미
-------------------------------------------------
* 모든 문자를 의미
-------------------------------------------------
[] 범위를 지정, [a-z]* ---> 소문자
-------------------------------------------------
[^] ^ 다음의 문자를 제외(except)하는 의미, 
[^a-c] ---> a부터 c로 시작하는 것은 제외
-------------------------------------------------

<grep 형식>

1)
grep  검색단어  파일명

또는

2)
명령어  |  grep  검색단어

#grep  Telnet  /etc/services

#grep  -i  Telnet  /etc/services
-i ignore-case (대소문자 구분 안함)

#grep  -n  telnet  /etc/services
-n line-number

#grep  -c  telnet  /etc/services
-c count (검색된 라인 갯수)

#cat  /etc/services  |  grep  telnet
---> 파이프를 이용한 필터링
또는
#grep  telnet  /etc/services

//////////////////////////////////////////////////////
#cat  /etc/hosts
#cat  /etc/hosts  |  vi
---> vi 는 파이프 되지 않는다.
모든 명령어가 파이프를 사용할 수 있는 것이 아니다.
---> vi  /etc/hosts 처럼 사용해야 한다.
//////////////////////////////////////////////////////

♥리눅스의 내부 통로
리눅스 운영체제 내부에는 데이터가 이동하는 3가지 통로가 있다.

표준입력(stdin)  - 0 : 키보드와 연결
표준출력(stdout) - 1 : 모니터와 연결
표준에러(stderr) - 2 : 모니터와 연결

--------------------------- 
Standard Input        0    <------------   키보드
---------------------------
 
---------------------------
Standard Output      1     -------+          
---------------------------             |
                                          +--->  모니터
---------------------------             |
Standard Error         2     -------+              
---------------------------

#A 라는 명령어를 실행했을 때 기본적으로 모니터로 출력되지만
#A | B 라고 실행할 경우 A 와 B 가 내부적으로 통로가 연결되어서(파이프) A 의 결과가 B 의 입력으로 전달이 된다.

#cd  /work
#pwd
(/work)
#ls
#ls | rm
---> 의 경우 rm 명령어는 파이프를 이용하는 것이 아니라 명령어 다음에 적은 인자값(인수,파일명)을 사용하기 때문에 제대로 실행되지 않는다.
--->파이프를 사용할 수 있는 명령어는 grep, sort, wc(필터류), more 등 한정되어 있다.

☞sort 명령어
파일의 텍스트 라인을 화면상에 정렬하여 출력한다.
기본적으로 알파벳 또는 숫자로 정렬한다.
space bar 또는 tab 으로 필드 구분을 한다.

-n 숫자로 정렬
-r 내림차순 정렬
-o 파일로 저장
-t 필드(라인의 각 항목) 구분자 지정
-k 정렬할 필드 지정

#sort  /etc/group

#sort  -r  /etc/group
---> 역순 정렬

#sort  -t  :  -k 3  -n  /etc/group
---> 그룹 번호를 이용한 정렬

#man sort
   -t, --field-separator=SEP use SEP instead of non-blank to blank  transi-
              tion(한 라인에서 필드를 구분하는 공통된 문자-Token)
   -k, --key=POS1[,POS2]
              start a key at POS1, end it at POS 2 (origin 1)
    (정렬에 사용할 필드)

♥실습
<파일 또는 디렉토리만 출력하도록 알리아스 설정하기>
Q)alias, ls, |, grep 을 이용하여 lsf 를 입력하면 파일만 출력되고 lsd 를 입력하면 디렉토리만 출력되도록 알리아스를 설정하시오

//////////////////////////////////////////////////////

#mkdir  /work3
#cd  /work3
#mkdir  a  b  c
#touch  1.txt  2.txt  3.txt
#ls
1.txt  2.txt  3.txt  a  b  c
#pwd
/work3
#ll
합계 12
-rw-r--r--  1 root root    0 12월 11 22:51 1.txt
-rw-r--r--  1 root root    0 12월 11 22:51 2.txt
-rw-r--r--  1 root root    0 12월 11 22:51 3.txt
drwxr-xr-x  2 root root 4096 12월 11 22:50 a
drwxr-xr-x  2 root root 4096 12월 11 22:50 b
drwxr-xr-x  2 root root 4096 12월 11 22:50 c


#alias lsf='ls -l | grep "^-"'
#alias lsd='ls -l | grep "^d"'
#lsf
#lsd
//////////////////////////////////////////////////////

☞wc 명령어(word count)
파일내의 라인수,단어수,문자수 를 확인할 때 사용

#wc  --help
#wc  /etc/hosts
라인수  단어수  문자수

#wc  -l    /etc/hosts
#wc  -w  /etc/hosts
#wc  -c  /etc/hosts

#cat  /etc/hosts | wc -l

☞df 
disk free, 하드디스크의 파티션별 정보 출력
-k 킬로바이트 출력
-h, --human-readable  print sizes in human readable format (e.g., 1K 234M 2G)

/dev/sda : 하드디스크 전체
/dev/sda1 : 첫번째 파티션
/dev/sda2 : 두번째 파티션
/dev/sda3 : 세번째 파티션

[/dev/sda1(첫번째 파티션) | /dev/sda2(두번째 파티션) | /dev/sda3(세번째 파티션)]
---> 하드디스크

//////////////////////////////////////////////////////////////////////////
#man   df
DF(1)                                                                   DF(1)

NAME
      df - 디스크의 남은 공간을 보여준다.
//////////////////////////////////////////////////////////////////////////


[root@cent ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             15116836   4646976   9701956  33% /
none                    257752         0    257752   0% /dev/shm
/dev/sda3              4482820     42500   4212600   1% /home
[root@cent ~]#
[root@cent ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              15G  4.5G  9.3G  33% /
none                  252M     0  252M   0% /dev/shm
/dev/sda3             4.3G   42M  4.1G   1% /home
[root@cent ~]#

df  는 하드디스크의 사용 현황을 확인하는 명령어로 기본적으로 킬로바이트로 출력
-h 옵션은 읽기 쉽도록 메가바이트, 기가바이트로 출력

/dev/sda1 은 하드디스크의 첫번째 파티션으로 15G 가 전체용량이고 33% 를 사용했음을 확인할 수 있다.
/dev/shm 은 메모리를 디스크처럼 사용하기 위해 리눅스가 자동으로 만든 것

☞awk
패턴 처리 명령어
$5 5번째 항목을 의미

//////////////////////////////////////////////////////////////////////////
#man  awk

GAWK(1)                        Utility Commands                       GAWK(1)

NAME
      gawk - pattern scanning and processing language
//////////////////////////////////////////////////////////////////////////

awk 는 파일의 내용을 프로그래밍적으로 처리해 주는 명령어
division.txt 파일에 아래와 같이 입력되어 있다고 하면

[root@cent ~]# cat division.txt
seoul     pusan      daegu
orange   mango    apple

위 의 내용중에서 첫번째 열(seoul 과 orange)만을 출력시키고 싶을 때 awk 를 사용할 수 있다.
사용법은 awk '{ print 출력할열 }' 파일명
출력할 열은 첫번째는 $1 이 되고 두번째는 $2 가 된다.
division.txt 에서는 두 번째 열(두번째 세로줄)은 pusan 과 mango 가 된다.

예제1)
[root@cent ~]# awk '{ print $1 }' division.txt
seoul
orange

예제2)
[root@cent ~]# awk '{ print $2 }' division.txt
pusan
mango

예제3)
[root@cent ~]# cat division.txt | awk '{ print $1 }'
seoul
orange
[root@cent ~]#
---> 파이프를 이용하여 출력한 예
     예제1 과 예제3은 결과가 동일
     예제1은 파이프를 사용하지 않고 파일을 직접 이용한 경우
     예제3은 파이프를 사용해서도 동일한 결과를 출력시킬 수 있다는 예

#df -h | sort | head -2 | awk '{ print $6 " : " $5 }'
/ : 28%
/home : 1%

<파일 검색>
1) GUI 프로그램
    리눅스 메뉴표시줄-명령-파일 찾기
2) find 명령어
형식)
find <탐색을 시작할 경로> [옵션]

파일이 어느 경로에 있는지 모를 때는 / 를 사용하면 된다. 
최상위 부터 검색하므로 시간이 많이 걸린다.
탐색 경로를 생략하면 현재 디렉토리를 기준으로 찾는다.

2) find 옵션
-name     이름으로 검색
-empty    empty 파일 검색
-uid UID   UID(사용자 번호)로 검색
-gid GID   GID(그룹 번호)로 검색
-newer    지정한 파일 이후에 만들어진 파일 검색
-perm     퍼미션으로 검색
-user      소유자로 검색
-exec      찾은 파일을 대상으로 명령어 실행
-ok         exec 와 비슷하나 질문 출력

#man  find
space bar 다음 페이지 
q 종료

NAME
       find - search for files in a directory hierarchy
SYNOPSIS
       find [path...] [expression]
 If no expression
       is given, the expression ‘-print’ is used.
 ACTIONS
       -exec command ;
       Execute  command;  true  if  0 status is returned.  
       All following arguments to find are taken to be arguments
       to the command  until an argument consisting of ‘;’ is encountered.  
       The string ‘{}’ is replaced by the current file name
       being processed  everywhere  it
       occurs  in  the  arguments  to the command, not just in arguments
       where it is alone, as in some versions of find.   Both  of  these
       constructions  might need to be escaped (with a ‘\’) or quoted to
       protect them from expansion by the shell.  The  command  is  executed in the starting directory.

       -ok command ;
       Like  -exec  but  ask  the  user  first

#find  --help

#mkdir  /work5
#cd  /work5
#touch  user1.txt  user2.txt  cent.dat
#ls 

#find  *
---> O
#find  /work5  -name  *
---> X 
#find   /work5  -name  *.txt 
---> /work5 부터 txt 로 끝난 모든 파일을 찾으라는 의미

#find   /work5  -name  "*" 
---> O
#find   /work5  -name  "*.txt" 
---> O

---> 쉘명령어 사용시 * 나 공백이 들어간 경우 
     쉘이 특별하게 생각하기 때문에 결과가 올바르게 
     나오지 않을 수 있다.
     이 때는 쿼팅을 사용하면 된다.

#find   /work5  -name  user1.txt  -print 
-print 는 디폴트 옵션이다.

#man  bash

쿼우팅(QUOTING)
쿼우팅은 쉘에 있어 특별한 의미를 갖는 문자나 단어의 그 의미를제거할 때 사용한다.

<쿼팅(Quoting)>
작은따옴표, 큰따옴표, 역따옴표, \ 등을 사용하는 것을 쿼팅 이라 부른다.

' 작은따옴표
" 큰따옴표
` 역따옴표(1번키 왼쪽키-Back Quote)
\ 역슬래쉬(해석금지의 의미)

---> * 의 경우 ' 나 " 둘 다 사용할 수 있지만
      변수의 경우 '(작은따옴표) 는 $ 표시와 변수이름 자체가 출력되고
      " 는 변수의 값이 출력된다.
      `(역따옴표) 는 명령어의 결과를 변수에 저장할 때 쓰인다.

---> 작은 따옴표와 큰따옴표를 섞어서 사용하면 안 된다.

#find  /work5  -name  "*" 
---> O
#find  /work5  -name  '*' 
---> O
#find  /work5  -name  \*
---> O

#echo '$LANG' 
---> 변수이름 출력
#echo "$LANG" 
--->변수 값 출력
#echo  $LANG 
---> 변수 값 출력
#echo  \$LANG
---> 변수 해석 금지
#\rm  user1.txt
---> 알리아스 해석 금지

Q)공백이 들어간 디렉토리로 이동하려면 ?

☞uname 명령어
운영체제의 종류와 버전 확인
uname -a (모든 정보 출력)
uname -s (운영체제 종류)
uname -r (운영체제 릴리스-release 버전)
uname -sr (종류 + 릴리스)
uname -n (컴퓨터 이름)
uname -i (하드웨어 플랫폼)
uname -p (프로세서 종류)

//////////////////////////////////////////////////////////////////////////
#man  uname

UNAME(1L)                                                           UNAME(1L)

이름
       uname - 시스템 정보를 출력한다

개요
       uname   [-snrvma]  [--sysname]  [--nodename]  [--release]  [--machine]
       [--all] [--help] [--version]

설명
       이 맨페이지는 GNU 버전의 uname 을 설명한다.  uname 은 현재 작동  중 인
       머 신 과 운영체제에 대한 정보를 출력한다.  아무런 옵션도 주어지지 않으
       면, uname 은 마치 -s 옵션이 주어진 것처럼 동작한다.  여러 개의 옵션 이
       주 어 지 거 나 -a 옵션이 주어지면 각 항목마다 스페이스 문자로 구분하여
       ‘snrvm’ 순서대로선택된 정보를 출력한다.

   옵션
       -m, --machine
              머신(하드웨어) 타입을 출력한다.

       -n, --nodename
              머신의 네트웍 노드 호스트명을 출력한다.

       -r, --release
              운영체제 릴리즈 넘버를 출력한다.
//////////////////////////////////////////////////////////////////////////

#uname
--->운영체제 정보 출력 명령

#temp=`uname` (역따옴표 사용)
---> = 사이에 공백이 있으면 안 됨
---> uname 명령어의 결과가 메모리상의 temp 라는 변수에 저장 됨

#echo  $temp
Linux

#temp='uname' (작은따옴표) 또는 temp="uname"
---> uname 이라는 문자열이 변수에 저장 됨
#echo  $temp
uname

#mkdir /work6
#cd   /work6

#touch  a.c  b.c 
#mkdir  mydir.c

#find  .  -name  "*.c"   -type   f
-type : 파일 또는 디렉토리를 지정하는 옵션(f 는 파일, d 는 디렉토리)

#chown  nobody.sys  a.c
#chown  nobody  b.c
#ll
#find  /work6  -user  nobody  -group  sys

#mkdir  /work62
#cd  /work62
#touch  f1  f2  f3  f4  f5  f6
#rdate  -s  time.bora.net
외부 타임서버 이용하여 리눅스 머신의 시간을 표준시로 동기화 (인터넷이 되어야 시간이 동기화 된다.)
#date

현재 날짜와 시간을 기준으로 아래와 같이 변경
#touch  -t  월일시간분  f6 (현재 날짜와 시간 : 월 일 시 분)
#touch  -t  월일시간분  f5 (현재 날짜에서 -1 한 날짜)
#touch  -t  월일시간분  f4 (현재 날짜에서 -2 한 날짜)
#touch  -t  월일시간분  f3 (현재 날짜에서 -3 한 날짜)
#touch  -t  월일시간분  f2 (현재 날짜에서 -4 한 날짜)
#touch  -t  월일시간분  f1 (현재 날짜에서 -5 한 날짜)
#ls -l f*

#find . -mtime 3 -type f -ls 
(수정날짜가 3일전인 파일)

#find . -mtime -3 -type f -ls 
(수정날짜가 현재 날짜부터 3일 이전 파일) ---> 수정한지 3일이 지나지 않은 파일

#find . -mtime +3 -type f -ls
(수정날짜가 3일 지난 파일)

#man find
    +n     for greater than n,
    -n     for less than n,
     n      for exactly n.

-ls    True; list current file in ‘ls -dils’ format on standard  output.

#man  ls
       -f      경로 내용을 정열하지 않는다: 이것은디스크에 저장된 순으로 보여준다.  -a와 -U 옵션과 같은 뜻이 며,  -l, -s, -t. 옵션과 반대뜻이다.

☎파일을 찾아서 지우는 예제

#mkdir /work7
#cd   /work7
#touch  user1.txt  user2.txt  cent.dat
#find  /work7  -name  cent.dat  -exec  rm  {}  \;
---> 질문없이 바로 삭제 된다.

{} 는 찾은 파일을 의미하고 
\; 는 명령어가 끝났음을 의미한다.

#find  /work7  -name  user2.txt  -ok  rm  {}  \;
질문이 나올 때 엔터만 치면 삭제되지 않는다. y 를 누르면 파일이 삭제된다.
-exec,ok 다음에는 ll 같은 알리아스를 적으면 안 됨 (알리아스는 쉘의 기능, find 는 알리아스를 처리하지 않는다.)

◆퍼미션을 이용한 find 검색
#man find
       -perm mode
              File’s permission bits are  exactly  mode  
       -perm -mode 
              All of the permission bits mode are set for the file. (AND 연산자)
       -perm +mode 
              Any of the permission bits mode are set for the file. (OR 연산자)

#mkdir /work8
#cd  /work8
#touch  my0  my1  my2  my3  my4  my5  my6  my7
#chmod  000  my0
#chmod  100  my1
#chmod  200  my2
#chmod  300  my3
#chmod  400  my4
#chmod  500  my5
#chmod  600  my6
#chmod  700  my7
#ll

#find . -perm 600 -type f -ls

#find . -perm -600 -type f -ls 
(rw 로 검색, AND 연산자 역할, 퍼미션이 rw 이상인 파일 검색)

#find . -perm +600 -type f -ls 
(r 또는 w 로 검색, OR 연산자 역할)

6(rw)=4(r) + 2(w)



와우.. 쉽지 않네요. 그래도 나중을 위해서 이렇게~
이상, 엠토리 였습니다. 항상 행.복.하시길~^^