'OS/리눅스 & 유닉스'에 해당되는 글 130건

  1. 2011.11.08 wait(), waitpid()
  2. 2011.11.08 + 프로세스 & 좀비프로세스 +
  3. 2011.11.08 shmget(), shmat(), shmdt() - 공유메모리 공간 할당/첨부/분리
  4. 2011.11.08 유닉스(리눅스) 시그널 종류
  5. 2011.11.02 vim 메뉴얼
  6. 2011.09.14 shell 조건식
  7. 2011.09.08 Bash를 이용한 쉘 스크립팅
  8. 2011.09.08 2>&1
  9. 2011.09.08 awk
  10. 2011.08.26 awk

wait(), waitpid()

OS/리눅스 & 유닉스 2011. 11. 8. 16:08

wait(), waitpid() : 부모 프로세스가 자식 프로세스가 종료했음을 확인하는 함수.

waitpid() : 인자로 프로세스ID를 받음으로써 특정 자식 프로세스의 종료를 기다릴수 있다.

함수원형

    #include <sys/types.h>
    #include <sys/wait.h>
   
    pid_t wait(int *status);
    pid_t waitpid(pid_t pid, int *status, int options); 

 
※ 자식 프로세스의 상태를 확인하는 매크로들

매크로

세부사항

WIFEXITED(status)

0이 아닌 값을 리턴하면 자식프로세스가 정상종료했다는 뜻이다.

WEXITSTATUS(status)

WIFEXITED(status)매크로를 통하여 자식 프로세스가 정상종료했음을 확인하면 이 매크로를 통하여 종료 코드를 확인할 수 있다. 이 종료 코드는 exit()나 _exit()에서 인자로 주는 값을 말한다. 즉 exit(0)으로  프로그램을 종료했다면 이 0 값이 WIFEXITED 매크로로 알수 있다. 단, 이 매크로는 하위 8비트 값만을 확인하므로 0부터 255까지의 값까지 확인할 수 있다.

WIFSIGNALED(status)

이 매크로가 참이라면 자식 프로세스가 비정상 종료했다는 뜻.

WTERMSIG(status)

SIFSIGNALED(status)매크로가 참일 경우 자식 프로세스를 종료시킨 시그널 번호를 얻는 매크로

WIFSTOPPED(status)

이 매크로가 참이면 자식 프로세스는 현재 멈춰있는(stopped) 상태이다. 다음에서 살펴볼 option인자에 WUNTRACED옵션이 설정되어 있는 경우 자식 프로세스의 멈춤 상태를 알아낼수 있다.

WSTOPSIG(status)

WIFSTOPPED(status)매크로가 참일 경우 자식 프로세스를 멈춤상태로 만든 시그널번호를 얻는다.

WCOREDUMP(status)

시스템에 따라서는 WIFSIGNALED(status)가 참일 경우 자식 프로세스가 core덤프 파일을 생성했는지를 확인하는 이 매크로를 제공해주기도 한다.

 

※ waitpid()에서 사용하는 pid인자값의 의미

pid의 값

세부사항

pid < -1

 pid의 절대값과 동일한 프로세스 그룹ID의 모든 자식 프로세스의 종료를 기다린다. 

pid == -1

모든 자식 프로세스의 종료를 기다린다.
만약 pid값이 -1이면 waitpid함수는 wait()함수와 동일하다. 

pid == 0

현재 프로세스의 프로세스 그룹ID와 같은 프로세스 그룹ID를 가지는 모든 자식 프로세스의 종료를 기다린다.

pid > 0

pid값에 해당하는 프로세스 ID를 가진 자식 프로세스의 종료를 기다린다.

 

※ waitpid()에서 사용하는 option인자

인자

인자의 의미

WNOHANG

waitpid()를 실행했을 때, 자식 프로세스가 종료되어 있지 않으면 블록상태가 되지 않고 바로 리턴하게 해준다.

WUNTRACED

pid에 해당하는 자식 프로세스가 멈춤 상태일 경우 그 상태를 리턴한다.
즉 프로세스의 종료뿐 아니라 프로세스의 멈춤상태도 찾아낸다. 

 

※ 좀비 프로세스 (zombie process) : 자식 프로세스가 종료되었지만, 부모 프로세스가 아직 그 종료를 확인하지 않는 프로세스 

※ 고아 프로세스 : 자식보다 먼저 부모프로세스가 죽었을 경우의 자식 프로세스.

[출처] wait(), waitpid()|작성자 달마

:

+ 프로세스 & 좀비프로세스 +

OS/리눅스 & 유닉스 2011. 11. 8. 16:07
파일과 같이 프로세스도 생성 못지않게 소멸이 중요하다. 만약 대충 소멸해 놓으면 이 소멸되지 않은 프로세스들이 돌아다니게 된다.
프로세스가 생성되고 실행을 완료 하면 사라져야하는데 사라지지 않고 시스템의 중요한 리소스를 차지하기도 한다.
이 상태의 프로세스를 좀비 프로세스 라고 하는데 시스템에 아주 큰 부담을 주는 원인이 된다.
좀비 생성이유
- 인자를 전달하면서 exit를 호출하는 경우
- main함수에서 return 문을 실행하면서 값을 반환하는 경우

exit함수로 전달되는 인자 값과 main 함수의 return문에 의해 반환되는 값 모두 운영체제로 전달된다. 운영체제는 이 값이 자식프로세스를 생성한 부모 프로세스에게 전달될 때까지 자식 프로세스를 소멸시키지 않는데, 이것을 좀비 프로세스라고 한다. 즉, 자식 프로세스를 좀비 프로세스로 만드는 주체는 운영체제이다.
" 해당 자식프로세스를 생성한 부모 프로세스에게 exit함수의 인자 값이나 return 문의 반환 값이 전달 되어야 한다."
이렇게 해야 좀비프로세스는 소멸이 된다.


첫번째 그림이 좀비 프로세스가 되는 경우 이다.
그러나 두번째 그림 처럼 부모 프로세스가 운영체제에게 자식프로세스를 소멸해달라고 전해주게 되면 좀비프로세스가 생기지 않는다.
부모프로세스가 커널에게 자식프로세스가 리턴한 값을 건네달라고 요청을 해야만 커널은 부모프로세스에게 자식프로세스로 부터 건네 받은 값을 전달한다.

                                                    + 좀비 프로세스의 소멸1 +
부모프로세스가 커널에게 자식프로세스가 종료할때 건네준 값을 달라고 요청하는것이 wait()함수이다.
wati()함수의 원형이다.
#include <sys/wait.h>
pid_t wait(int * statloc);
wait함수가 호출되었을때, 이미 종료된 자식프로세스가 있다면, 자식프로세스가 종료되면서 전달한 값이 매개변수로 전달된 주소의 변수에 저장된다. 
statloc : 포인터 statloc이 가리키는 변수에 자식 프로세스 종료시 리턴하거나 exit함수 호출시 전달한 인자값이 저장됨.
WIFEXITED : 자식 프로세스가 정상 종료한 경우 'TRUE'반환
WEXITSTATUS : 자식 프로세스의 전달 값을 반환한다.

wait(&statue);  <- wait함수호출( 종료된 프로세스 관련정보는 statue에 담기게 된다.)
if(WIFEXITED(status) ) //정상종료 했나?
{
  printf("child pass num : %d", WEITSTATUS(status) ); // 반환값을 출력 해~
}
                                                    + 좀비 프로세스의 소멸2 +
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);
pid : 종료를 확인하고자 하는 자식프로세스의 ID전달 대신 -1을 전달하면 wait함수와 마찬가지로 임의의 자식 프로세스가 종료되기를 기다린다.
statloc : wait함수 와 동일한 의미
options : WNOHANG을 인자로 전달하면, 종료된 자식 프로세스가 존재하지 않아도 블로킹 상태에 있지않고 0을 반환하며 함수 빠져나온다.
ex)
pid_t pid= fork();
while(waitpid(-1, &status, WNOHANG) ); 
<- waitpid함수호출(종료된 프로세스 status에 저장, WNOHANG을 전달하였으므로, 종료된 자식 프로세스가 없으면 0을 반환)
  printf("child pass num : %d", WEITSTATUS(status) ); // 반환값을 출력 해~

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

waitpid  (0) 2011.11.08
wait(), waitpid()  (0) 2011.11.08
shmget(), shmat(), shmdt() - 공유메모리 공간 할당/첨부/분리  (0) 2011.11.08
유닉스(리눅스) 시그널 종류  (0) 2011.11.08
vim 메뉴얼  (0) 2011.11.02
:

shmget(), shmat(), shmdt() - 공유메모리 공간 할당/첨부/분리

OS/리눅스 & 유닉스 2011. 11. 8. 15:45

리눅스에서 공유메모리를 출력해주는 명령어
ipcs -m:
■ 개념
   
   공유메모리는 단어 뜻에서 알 수 있듯이 하나의 프로세스에서가 아니라 여러 프로세스가 함께 사용하는 메모리를 말한다. 
   이 공유 메모리를 이용하면 프로세스끼리 통신을 할 수 있으며, 같은 데이터를 공유할 수 있다. 
   이렇게 같은 메모리 영역을 공유하기 위해서는 공유메모리를 생성한 후 프로세스의 자신의 영역에 첨부를 한 후에 
   마치 자신의 메모리를 사용하듯 사용한다.


■ shmget() - 공유메모리 생성 or 접근

   shmget()은 주어진 인자 key를 접근번호로 하는 공유메모리 공간할당을 커널에 요청한다.
   커널에서 성공적으로 공유메모리 공간을 할당하게 되면 공유 메모리를 가리키는 식별자를 리턴한다.
   생성될 공유메모리 공간의 크기는 size를 통해서 byte 단위 크기로 지정할 수 있다.
   
공간의 할당은 shmflg가 IPC_PRIVATE이거나 key 를 가지는 공유메모리영역이 존재하지 않거나,
   IPC_CREAT가 지정되었을 경우 (shmflg&IPC_CREAT가 0이 아닌)에 이루어진다.


   #include <sys/ipc.h>

   #include <sys/shm.h>

   int shmget(key_t key, int size, int shmflg);

   - key_t key : 공유 메모리를 구별하는 식별 번호
   - int size : 공유 메모리 크기
   - int shmflg : 동작 옵션
                      1) IPC_CREATE
                         : key에 해당하는 공유 메모리가 없다면 새로 생성한다. 
                           IPC_CREAT 값을 입력 한 후 | 연산자를 덧붙혀 허용권한을 설정한다.
                           만약있다면 무시하며 
생성을 위해 접근 권한을 지정해 주어야 한다.
                      2) IPC_EXCL
                         : 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에 접근하지 못한다.
                           
이 옵션이 없어야 기존 공유 메모리에 접근할 수 있다.

   반환 -1 : 실패
   shmget() 함수는 공유메모리의 확인자(ID)값을 리턴한다.


ex) shmget(7530, 1028, IPC_CREAT|0660) ;


■ shmat() - 공유 메모리를 프로세스에 첨부

   shmat()는 공유메모리 식별자인shmid에 공유 메모리 세그먼트를 붙이기 위해서 사용한다.
   붙이는 영역은 
shmaddr로 결정할 수 있다. 만약 shmaddr가 NULL이라면 시스템은 적당한 사용하지 않는 메모리 영역을 붙이게 된다.
   

   #include <sys/type.h>
   #include <sys/shm.h>

   void *shmat(int shmid, const void* shmaddr, int shmflg);

   - 
int shmid : 공유 메모리를 구별하는 식별번호
   - void *shmaddr : 첨부되는 어드레스 주소, 일반적으로 NULL을 지정(0으로 설정하면 커널에 매핑되지 않은 지역을 자동으로 찾는다.)
   - int shmflg : 동작옵션

   
SHM_RDONLY : 공유 메모리를 읽기 전용으로
   
SHM_RND : shmaddr이 NULL이 아닌 경우일 때만 사용되며, shmaddr을 반올림하여 메모리 페이지 경계에 맞춘다.

   
반환 (void *)-1 : 실패
   shmat() 함수는 해당 공유 메모리 id값에 대한 어드레스를 리턴해준다. 
   
   ex) shmat(shmid, NULL, 0);


■ shmdt() - 공유 메모리를 분리

   shmdt()는 공유 메모리 영역으로 부터 shmaddr주소를 분리 시키기 위해서 사용한다.
   공유메모리 영역의 분리는 shmat 시스템 콜로 연결된 값과 동일한 shmaddr을 가지고 있는 연결된 영역들중 하나여야 한다.

   #include <sys/type.h>
   #include <sys/shm.h>

   int shmdt(const void *shmaddr);

   - 
void *shmaddr : 분리할 공유 메모리 주

   반환 -1 : 실패 (
0 : 공유 메모리 분리 성공 )

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

wait(), waitpid()  (0) 2011.11.08
+ 프로세스 & 좀비프로세스 +  (0) 2011.11.08
유닉스(리눅스) 시그널 종류  (0) 2011.11.08
vim 메뉴얼  (0) 2011.11.02
shell 조건식  (0) 2011.09.14
:

유닉스(리눅스) 시그널 종류

OS/리눅스 & 유닉스 2011. 11. 8. 13:30

 Linux 상에서 33 번 부터 62 번까지는 리얼타임 시그널을 위해서 예약된 시그널입니다.

 

#define SIGHUP          1       /* Hangup (POSIX).  */
#define SIGINT          2       /* Interrupt (ANSI).  */
#define SIGQUIT         3       /* Quit (POSIX).  */
#define SIGILL          4       /* Illegal instruction (ANSI).  */
#define SIGTRAP         5       /* Trace trap (POSIX).  */
#define SIGABRT         6       /* Abort (ANSI).  */
#define SIGIOT          6       /* IOT trap (4.2 BSD).  */
#define SIGBUS          7       /* BUS error (4.2 BSD).  */
#define SIGFPE          8       /* Floating-point exception (ANSI).  */
#define SIGKILL         9       /* Kill, unblockable (POSIX).  */
#define SIGUSR1         10      /* User-defined signal 1 (POSIX).  */
#define SIGSEGV         11      /* Segmentation violation (ANSI).  */
#define SIGUSR2         12      /* User-defined signal 2 (POSIX).  */
#define SIGPIPE         13      /* Broken pipe (POSIX).  */
#define SIGALRM         14      /* Alarm clock (POSIX).  */
#define SIGTERM         15      /* Termination (ANSI).  */
#define SIGSTKFLT       16      /* Stack fault.  */
#define SIGCLD          SIGCHLD /* Same as SIGCHLD (System V).  */
#define SIGCHLD         17      /* Child status has changed (POSIX).  */
#define SIGCONT         18      /* Continue (POSIX).  */
#define SIGSTOP         19      /* Stop, unblockable (POSIX).  */
#define SIGTSTP         20      /* Keyboard stop (POSIX).  */
#define SIGTTIN         21      /* Background read from tty (POSIX).  */
#define SIGTTOU         22      /* Background write to tty (POSIX).  */
#define SIGURG          23      /* Urgent condition on socket (4.2 BSD).  */
#define SIGXCPU         24      /* CPU limit exceeded (4.2 BSD).  */
#define SIGXFSZ         25      /* File size limit exceeded (4.2 BSD).  */
#define SIGVTALRM       26      /* Virtual alarm clock (4.2 BSD).  */
#define SIGPROF         27      /* Profiling alarm clock (4.2 BSD).  */
#define SIGWINCH        28      /* Window size change (4.3 BSD, Sun).  */
#define SIGPOLL         SIGIO   /* Pollable event occurred (System V).  */
#define SIGIO           29      /* I/O now possible (4.2 BSD).  */
#define SIGPWR          30      /* Power failure restart (System V).  */
#define SIGSYS          31      /* Bad system call.  */

:

vim 메뉴얼

OS/리눅스 & 유닉스 2011. 11. 2. 09:44
저장 및 종료
 
:w     저장
:w file.txt    file.txt 파일로 저장
:w >> file.txt    file.txt 파일에 덧붙여서 저장
:q    vi 종료
ZZ    저장 후 종료
:wq!    강제 저장 후 종료
:e file.txt    file.txt 파일을 불러옴
:e    현재 파일을 불러옴
 
입력모드 전환 키
 
a    커서 위치 다음 칸부터 입력
A    커서 행의 맨 마지막부터 입력
i    커서의 위치에 입력
I    커서 행의 맨 앞에서부터 입력
o    커서의 다음 행에 입력
O    커서의 이전 행에 입력
s    커서 위치의 한 글자를 지우고 입력
cc    커서 위치의 한 행을 지우고 입력

라인 설정/이동
:set nu
:set nonu
:n

명령모드 입력 키
 
h    왼쪽으로 커서 이동
j    아래쪽으로 커서 이동
k    위쪽으로 커서 이동
l    오른쪽으로 커서 이동
b or B    이전 단어의 첫 글자로 이동
w or W    다음 단어의 첫 글자로 이동
e or E    단어의 마지막 글자로 이동
<CR>    다음 행의 첫 글자로 이동
^    현재 행의 첫 글자로 이동
$    현재 행의 마지막 글자로 이동
-    이전 행의 첫 글자로 이동
+    다음 행의 첫 글자로 이동
(    이전 문장의 첫 글자로 이동
)    다음 문장의 첫 글자로 이동
{    이전 문단으로 이동
}    다음 문단으로 이동
H    커서를 화면의 맨 위로 이동
M     커서를 화면의 중앙으로 이동
L    커서를 화면 최하단으로 이동
z<CR>    현재 행을 화면의 맨 위로 이동
z.    현재 행을 화면의 중앙으로 이동
z-    현재 행을 화면의 최하단으로 이동
[n]H    커서를 위에서 n행으로 이동
[n]L    커서를 아래에서 n행으로 이동
ctrl+u    반 화면 위로 스크롤
ctrl+d    반 화면 아래로 스크롤
ctrl+b    한 화면 위로 스크롤
ctrl+f    한 화면 아래로 스크롤
gg or 1G    문서의 첫 행으로 이동
G    문서의 마지막 행으로 이동
[n]G or :[n]    n행으로 이동
 
삭제와 관련되 키
 
x or dl    커서 위치의 글자 삭제
X or dh    커서 바로 앞의 글자 삭제
dw    한 단어를 삭제
d0    커서 위치부터 행의 처음까지 삭제
D or d$    커서 위치부터 행의 끝까지 삭제
dd    커서가 있는 행을 삭제
dj    커서가 있는 행과 그 다음 행을 삭제
dk    커서가 있는 행과 그 앞행을 삭제
 
복사 & 붙이기
 
yw    현재 커서 위치의 한 단어를 복사한다.
yy    현재 커서 위치의 한 행을 복사한다.
p    복사한 내용을 붙여 넣는다.
 
잘라내기
 
vi는 총 17개의 레지스터를 갖고 있다.
"" "0 "1 "2 "3 "4 "5 "6 "7 "8 "9 "- ". ": "% "# "/
"" 레지스터에는 바로 이전에 지워진 내용이 들어간다.
"1 ~ "9 레지스터에는 지워진 내용이 큐 형식으로 들어간다.
". 레지스터에는 최근까지 타이핑한 내용이 들어간다.
"% 레지스터에는 현재 편집하는 파일명이 들어간다.
"/ 레지스터에는 가장 최근에 검색한 문자열이 들어간다.
 
예를 들어, "1pu.u.u 명령으로 각 레지스터에 있는 내용을 하나씩 되돌리면서 붙여넣기 할 수 있디.
"1p 1번 레지스터의 내용을 붙여넣는다.
u 되돌리기
. 바로 이전에 했던 작업을 반복
 
:reg    레지스터를 본다.
 
블록지정
 
v    블럭지정.
ctrl+v    사각 블럭지정.
 
블록지정 후 사용 가능한 키
 
~    대소문자 전환
u    소문자로 만듦.
U    대문자로 만듦.
d    삭제
y    복사
c    치환
J    행을 합침
>    행 앞에 탭 삽입
<    행 앞에 탭 제거
:    선택된 영역에 대하여 ex 명령
 
되돌리기와 되살리기
 
u    되돌리기
ctrl+r    되살리기
 
문자열 탐색
 
/[찾고자 하는 문자열]
?[찾고자 하는 문자열]
n    다음에 매칭되는 문자열로 이동.
N    이전에 매친된 문자열로 이동.
 
문자열 치환
 
:[범위]/[매칭 문자열]/[치환 문자열]/[행 범위]
 
:s/old/new    현재 행의 처음 old를 new로 교체.
:s/old/new/g       현재 행의 모든 old를 new로 교체.
:2,4s/old/new/g     2행에서 4행까지 모든 old를 new로 교체.

:-1,+3s/old/new/g     커서 위치에서 위로 1행 아래로 3행 되는 범위에서 매칭되는 문자열을 치환.:%s/old/new/g    문서 전체에서 old를 new로 교체.
:%s/old/new/gc       문서 전체에서 old를 new로 확인하며 교체.
 
:[범위]/[패턴]/[매칭 문자열]/[치환 문자열]/[행 범위]
 
:g/pattern/s/old/new/g       pattern이 있는 모든 행의 old를 new로 교체.
:g/pattern/s//new/g    :%s/old/new/g와 동일. 


화면 나누기 
:split [파일이름]수평나누기
:vs [파일이름] 수직나누기 
파일이름을 지정한 경우, 
새로 만들어진 창에는 파일이름 을 가지는 파일이 열리고,
파일이름을 지정하지 않을경우 똑같은 파일이 열림 

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

shmget(), shmat(), shmdt() - 공유메모리 공간 할당/첨부/분리  (0) 2011.11.08
유닉스(리눅스) 시그널 종류  (0) 2011.11.08
shell 조건식  (0) 2011.09.14
Bash를 이용한 쉘 스크립팅  (0) 2011.09.08
2>&1  (0) 2011.09.08
:

shell 조건식

OS/리눅스 & 유닉스 2011. 9. 14. 08:58

    조건식

    if, while, until 구문에서는 조건식이 사용된다. 조건식은 참과 거짓의 결과를 내는 구문이다. 참일 경우 조건식은 0을 반환하고, 거짓일 경우에는 1을 반환한다. 조건식의 형식은 다음과 같다.

    test 식
    [ 식 ]
    :

    식은 파일식, 문자열식, 수식의 세 종류로 크게 나눌 수 있다. :는 항상 참임을 나타낸다. while, until에서 무한 루프를 만들기 위해 사용된다.

    파일식은 어떤 파일의 속성을 검사하는 것으로 다음과 같은 종류가 있다.

    -b 파일 : 파일이 블럭 장치 파일이면 참
    -c 파일 : 파일이 문자 장치 파일이면 참
    -d 파일 : 파일이 디렉토리이면 참
    -e 파일 : 파일이 존재하면 참
    -f 파일 : 파일이 정규 파일이면 참
    -L 파일 : 파일이 심볼릭 링크이면 참
    -p 파일 : 파일이 네임드(named) 파이프이면 참
    -S 파일 : 파일이 소켓이면 참
    -r 파일 : 파일이 읽기 가능이면 참
    -s 파일 : 파일의 크기가 0보다 크면 참
    -w 파일 : 파일이 쓰기 가능이면 참
    -x 파일 : 파일이 실행 가능이면 참
    파일1 -nt 파일2 : 파일1이 파일2보다 새로운 파일이면 참
    파일1 -ot 파일2 : 파일1이 파일2보다 오래된 파일이면 참
    파일1 -ef 파일2 : 파일1과 파일2가 같은 파일이면 참

    문자열식은 문자열에 대한 비교를 한다.

    -z 문자열 : 문자열의 길이가 0이면 참
    -n 문자열 : 문자일의 길이가 0이 아니면 참
    문자열1 = 문자열2 : 문자열1과 문자열2가 같으면 참
    문자열1 != 문자열2 : 문자열1과 문자열2가 다르면 참

    수식은 숫자값을 비교한다. 양의 정수, 음의 정수, 0, 변수값이 올 수 있다.

    값1 -eq 값2 : 값1 = 값2
    값1 -ne 값2 : 값1 != 값2
    값1 -lt 값2 : 값1 < 값2
    값1 -le 값2 : 값1 <= 값2
    값1 -gt 값2 : 값1 > 값2
    값1 -ge 값2 : 값1 >= 값2

    이외에도 다음과 같이 식 전체에 대한 연산이 가능하다.

    ! 식 : 식에 대한 부정(not)
    식1 -a 식2 : 식1과 식2에 대한 논리곱(and)
    식1 -o 식2 : 식1과 식2에 대한 논리합(or)

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

유닉스(리눅스) 시그널 종류  (0) 2011.11.08
vim 메뉴얼  (0) 2011.11.02
Bash를 이용한 쉘 스크립팅  (0) 2011.09.08
2>&1  (0) 2011.09.08
awk  (0) 2011.09.08
:

Bash를 이용한 쉘 스크립팅

OS/리눅스 & 유닉스 2011. 9. 8. 16:46

고급 Bash 스크립팅 가이드

Bash를 이용한 쉘 스크립팅 완전 가이드

Mendel Cooper

Brindlesoft

thegrendel (at) theriver.com

차현진

terminus (at) kldp.org

2001년 12월 16일

본 튜토리얼은 여러분이 Bash에 대해서 어떠한 사전 지식도 없다고 가정을 합니다만, 금방 중/고급 수준의 명령어들을 소개합니다(...유닉스의 슬기롭고 교훈적인 부분들을 배워 나가면서). 이 문서는 교과서나, 혼자 공부할 때 볼 수 있는 메뉴얼, 쉘 스크립팅 기술에 대한 레퍼런스및 소스로 쓰일 수 있습니다. 스크립트를 배우는 유일한 방법은 스크립트를 직접 짜 보는 것이다라는 전제하에, 연습문제와 아주 자세하게 주석 처리된 예제들로 능동적인 독자들의 참여를 유도할 것입니다.

이 문서의 최신 버전은 저자의 홈페이지에서 SGML 소스와 HTML을 "타르볼"형태로 얻을 수 있습니다. 고침 변경 사항은 change log를 참고하세요.

고친 과정
고침 0.1 2000년 6월 14일 고친이 mc
초기 릴리스.
고침 0.2 2000년 10월 30일 고친이 mc
버그 수정, 내용및 예제 스크립트 추가.
고침 0.3 2001년 2월 12일 고친이 mc
메이저 업데이트.
고침 0.4 2001년 7월 8일 고친이 mc
버그 수정, 더 많은 내용및 예제 추가 - 완전한 책 형태의 개정판.
고침 0.5 2001년 9월 3일 고친이 mc
메이저 업데이트. 버그 수정, 내용 추가, 장과 절을 재편성.
고침 1.0.11 2001년 12월 16일 고친이 mc
버그 수정, 재편성, 내용 추가. Stable release.

바치는 글

모든 마법의 근원인 Anita에게 이 책을 바칩니다.

차례
Part 1. 소개
1. 왜 쉘 프로그래밍을 해야 하죠?
2. #! 으로 시작하기
2.1. 스크립트 실행하기
2.2. 몸풀기 연습문제(Preliminary Exercises)
Part 2. 기초 단계
3. 종료와 종료 상태(Exit and Exit Status)
4. 특수 문자
5. 변수와 매개변수 소개
5.1. 변수 치환(Variable Substitution)
5.2. 변수 할당(Variable Assignment)
5.3. Bash 변수는 타입이 없다(untyped)
5.4. 특수한 변수 타입
6. 쿼우팅(quoting)
7. 테스트
7.1. 테스트(Test Constructs)
7.2. 파일 테스트 연산자
7.3. 비교 연산자(이진)
7.4. 중첩된 if/then 조건 테스트
7.5. 여러분이 테스트문을 얼마나 이해했는지 테스트 해보기
8. 연산자 이야기(Operations and Related Topics)
8.1. 연산자(Operators)
8.2. 숫자 상수(Numerical Constants)
Part 3. 중급 단계(Beyond the Basics)
9. 변수 재검토(Variables Revisited)
9.1. 내부 변수(Internal Variables)
9.2. 문자열 조작
9.3. 매개변수 치환(Parameter Substitution)
9.4. 변수 타입 지정: declare 나 typeset
9.5. 변수 간접 참조
9.6. $RANDOM: 랜덤한 정수 만들기
9.7. 이중소괄호(The Double Parentheses Construct)
10. 루프와 분기(Loops and Branches)
10.1. 루프
10.2. 중첩된 루프
10.3. 루프 제어
10.4. 테스트와 분기(Testing and Branching)
11. 내부 명령어(Internal Commands and Builtins)
11.1. 작업 제어 명령어
12. 외부 필터, 프로그램, 명령어
12.1. 기본 명령어
12.2. 복잡한 명령어
12.3. 시간/날짜 명령어
12.4. 텍스트 처리 명령어
12.5. 파일, 아카이브(archive) 명령어
12.6. 통신 명령어
12.7. 터미널 제어 명령어
12.8. 수학용 명령어
12.9. 기타 명령어
13. 시스템과 관리자용 명령어
14. 명령어 치환(Command Substitution)
15. 산술 확장(Arithmetic Expansion)
16. I/O 재지향
16.1. exec 쓰기
16.2. 코드 블럭 재지향
16.3. 응용
17. Here Documents
18. 쉬어가기
Part 4. 고급 주제들(Advanced Topics)
19. 정규 표현식(Regular Expressions)
19.1. 정규 표현식의 간략한 소개
19.2. Globbing
20. 서브쉘(Subshells)
21. 제한된 쉘(Restricted Shells)
22. 프로세스 치환(Process Substitution)
23. 함수
23.1. 복잡 함수와 함수의 복잡성(Complex Functions and Function Complexities)
23.2. 지역 변수와 재귀 함수(Local Variables and Recursion)
24. 별칭(Aliases)
25. 리스트(List Constructs)
26. 배열
27. 파일들
28. /dev 와 /proc
28.1. /dev
28.2. /proc
29. 제로와 널(Of Zeros and Nulls)
30. 디버깅
31. 옵션
32. 몇 가지 지저분한 것들(Gotchas)
33. 스타일 있게 스크립트 짜기
33.1. 비공식 쉘 스크립팅 스타일시트
34. 자질구레한 것들
34.1. 대화(interactive)형 모드와 비대화(non-interactive)형 모드 쉘과 스크립트
34.2. 쉘 래퍼(Shell Wrappers)
34.3. 테스트와 비교: 다른 방법
34.4. 최적화
34.5. 팁 모음(Assorted Tips)
34.6. 괴상한 것(Oddities)
34.7. 이식성 문제(Portability Issues)
34.8. 윈도우즈에서의 쉘 스크립팅
35. Bash, 버전 2
36. 후기(Endnotes)
36.1. 저자 후기(Author's Note)
36.2. 저자에 대해서
36.3. 이 책을 만드는데 쓴 도구들
36.3.1. 하드웨어
36.3.2. 소프트웨어와 프린트웨어
36.4. 크레딧
서지사항
A. 여러분들이 보내준 스크립트들(Contributed Scripts)
B. Sed 와 Awk 에 대한 간단한 입문서
B.1. Sed
B.2. Awk
C. 특별한 의미를 갖는 종료 코드
D. I/O와 I/O 재지향에 대한 자세한 소개
E. 지역화(Localization)
F. 샘플 .bashrc 파일
G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환
H. 연습문제
I. Copyright
예 목록
2-1. cleanup: /var/log 에 있는 로그 파일들을 청소하는 스크립트
2-2. cleanup: 위 스크립트의 향상되고 일반화된 버전.
3-1. 종료/종료 상태
3-2. !으로 조건을 부정하기
4-1. 코드 블럭과 I/O 재지향
4-2. 코드 블럭의 결과를 파일로 저장하기
4-3. 최근 하루동안 변경된 파일들을 백업하기
5-1. 변수 할당과 치환
5-2. 평범한 변수 할당
5-3. 평범하고 재미있는 변수 할당
5-4. 정수? 문자열?
5-5. 위치 매개변수
5-6. whwhois 도메인 네임 룩업
5-7. shift 쓰기
6-1. 이상한 변수를 에코하기
6-2. 이스케이프된 문자들
7-1. 무엇이 참인가?
7-2. [ ] 와 test 의 동일함
7-3. (( ))로 산술식 테스트 하기
7-4. 산술 비교와 문자열 비교
7-5. 문자열이 인지 테스트 하기
7-6. zmost
8-1. 산술 연산자 쓰기
8-2. && 와 || 를 쓴 복합 조건 테스트
8-3. 숫자 상수 표기법:
9-1. $IFS 와 빈 칸
9-2. 타임 아웃 처리 입력
9-3. 타임 아웃 처리 입력, 한 번 더
9-4. 내가 루트인가?
9-5. arglist: $* 과 $@ 로 인자를 나열하기
9-6. 일관성 없는 $*과 $@의 동작
9-7. $IFS 가 비어 있을 때 $*와 $@
9-8. 밑줄 변수(underscore variable)
9-9. 그래픽 파일을 다른 포맷 확장자로 이름을 바꾸면서 변환
9-10. 매개변수 치환과 : 쓰기
9-11. 변수의 길이
9-12. 매개변수 치환에서의 패턴 매칭
9-13. 파일 확장자 바꾸기:
9-14. 임의의 문자열을 파싱하기 위해 패턴 매칭 사용하기
9-15. 문자열의 접두, 접미어에서 일치하는 패턴 찾기
9-16. declare를 써서 변수 타입 지정하기
9-17. 간접 참조
9-18. awk에게 간접 참조를 넘기기
9-19. 랜덤한 숫자 만들기
9-20. RANDOM 으로 주사위를 던지기
9-21. RANDOM 에 seed를 다시 지정해 주기
9-22. C 형태의 변수 조작
10-1. 간단한 for 루프
10-2. 각 [list] 항목이 인자를 두 개씩 갖는 for 문
10-3. Fileinfo: 변수에 들어 있는 파일 목록에 대해 동작
10-4. for 문에서 파일 조작하기
10-5. in [list]가 빠진 for 문
10-6. for 문의 [list]에 명령어 치환 쓰기
10-7. 이진 파일에 grep 걸기
10-8. 특정 디렉토리의 모든 바이너리 파일에 대해 원저작자(authorship)를 확인 하기
10-9. 디렉토리에 들어 있는 심볼릭 링크들을 나열하기
10-10. 디렉토리에 들어 있는 심볼릭 링크들을 파일로 저장하기
10-11. C 형태의 for 루프
10-12. 배치 모드로 efax 사용하기
10-13. 간단한 while 루프
10-14. 다른 while 루프
10-15. 다중 조건 while 루프
10-16. C 형태의 문법을 쓰는 while 루프
10-17. until 루프
10-18. 중첩된 루프
10-19. 루프에서 break와 continue의 영향
10-20. 여러 단계의 루프에서 탈출하기
10-21. 더 상위 루프 레벨에서 계속하기(continue)
10-22. case 쓰기
10-23. case로 메뉴 만들기
10-24. case용 변수를 만들기 위해서 명령어 치환 쓰기
10-25. 간단한 문자열 매칭
10-26. 입력이 알파벳인지 확인하기
10-27. select로 메뉴 만들기
10-28. 함수에서 select를 써서 메뉴 만들기
11-1. printf가 실제로 쓰이는 예제
11-2. read로 변수 할당하기
11-3. read로 여러줄의 입력 넣기
11-4. read를 파일 재지향과 같이 쓰기
11-5. 현재 작업 디렉토리 변경하기
11-6. let으로 몇 가지 산술 연산을 하기.
11-7. eval의 효과 보여주기
11-8. 강제로 로그 아웃 시키기
11-9. "rot13" 버전
11-10. 위치 매개변수와 set 쓰기
11-11. 변수를 "언셋"(unset) 하기
11-12. export를 써서, 내장된 awk 스크립트에 변수를 전달하기
11-13. getopts로 스크립트로 넘어온 옵션과 인자 읽기
11-14. 데이타 파일 "포함하기"
11-15. exec 효과
11-16. 작업을 계속 해 나가기 전에 프로세스가 끝나길 기다리기
12-1. CDR 디스크를 구울 때 ls로 목차 만들기
12-2. Badname, 파일 이름에 일반적이지 않은 문자나 공백 문자를 포함하는 파일을 지우기.
12-3. inode 로 파일을 지우기
12-4. 시스템 로그 모니터링용 xargs 로그 파일
12-5. copydirxargs로 현재 디렉토리를 다른 곳으로 복사하기
12-6. expr 쓰기
12-7. date 쓰기
12-8. 스크립트에서 두 파일을 비교하기 위해 cmp 쓰기.
12-9. 낱말 빈도수 분석
12-10. 10자리 랜덤한 숫자 만들기
12-11. tail로 시스템 로그를 모니터하기
12-12. 스크립트에서 "grep"을 에뮬레이트 하기
12-13. 목록에 들어 있는 낱말들의 유효성 확인하기
12-14. toupper: 파일 내용을 모두 대문자로 바꿈.
12-15. lowercase: 현재 디렉토리의 모든 파일명을 소문자로 바꿈.
12-16. du: 도스용 텍스트 파일을 UNIX용으로 변환.
12-17. rot13: 초허접(ultra-weak) 암호화, rot13.
12-18. "Crypto-Quote" 퍼즐 만들기
12-19. 파일 목록 형식화.
12-20. column 으로 디렉토리 목록을 형식화 하기
12-21. nl: 자기 자신에게 번호를 붙이는 스크립트.
12-22. cpio로 디렉토리 트리 옮기기
12-23. rpm 아카이브 풀기
12-24. C 소스에서 주석을 제거하기
12-25. /usr/X11R6/bin 둘러보기
12-26. basename과 dirname
12-27. 인코드된 파일을 uudecode하기
12-28. 저당에 대한 월 상환액(Monthly Payment on a Mortgage)
12-29. 진법 변환(Base Conversion)
12-30. 다른 방법으로 bc 실행
12-31. seq로 루프에 인자를 만들어 넣기
12-32. 키보드 입력을 갈무리하기
12-33. 파일을 안전하게 지우기
12-34. m4 쓰기
13-1. 지움 글자(erase character) 세팅하기
13-2. 비밀스런 비밀번호: 터미널 에코 끄기
13-3. 키누름 알아내기
13-4. pidof 로 프로세스를 죽이기
13-5. CD 이미지 확인하기
13-6. 한 파일에서 한번에 파일 시스템 만들기
13-7. 새 하드 드라이브 추가하기
13-8. killall/etc/rc .d/init.d 에서 인용
16-1. exec으로 표준입력을 재지향 하기
16-2. 재지향된 while 루프
16-3. 다른 형태의 재지향된 while 루프
16-4. 재지향된 until 루프
16-5. 재지향된 for 루프
16-6. 재지향된 for 루프(표준입력, 표준출력 모두 재지향됨)
16-7. 재지향된 if/then 테스트
16-8. 이벤트 로깅하기
17-1. dummyfile: 두 줄짜리 더미 파일 만들기
17-2. broadcast: 로그인 해 있는 모든 사람들에게 메세지 보내기
17-3. cat으로 여러 줄의 메세지 만들기
17-4. 탭이 지워진 여러 줄의 메세지
17-5. Here document에서 매개변수 치환하기
17-6. 매개변수 치환 끄기
17-7. upload"Sunsite" incoming 디렉토리에 파일 한 쌍을 업로드
17-8. "아무개"(anonymous) Here Document
20-1. 서브쉘에서 변수의 통용 범위(variable scope)
20-2. 사용자 프로파일 보기
20-3. 프로세스를 서브쉘에서 병렬로 돌리기
21-1. 제한된 모드로 스크립트 돌리기
23-1. 간단한 함수
23-2. 매개변수를 받는 함수
23-3. 두 숫자중 큰 수 찾기
23-4. 숫자를 로마 숫자로 바꾸기
23-5. 함수에서 큰 값을 리턴하는지 테스트하기
23-6. 큰 두 정수 비교하기
23-7. 사용자 계정 이름에서 실제 이름을 알아내기
23-8. 지역 변수의 영역(Local variable visibility)
23-9. 지역 변수를 쓴 재귀 함수
24-1. 스크립트에서 쓰이는 별칭(alias)
24-2. unalias: 별칭을 설정, 해제하기
25-1. "and list"를 써서 명령어줄 인자 확인하기
25-2. "and list"를 써서 명령어줄 인자를 확인하는 다른 방법
25-3. "or lists"와 "and list"를 같이 쓰기
26-1. 간단한 배열 사용법
26-2. 배열의 특별한 특성 몇 가지
26-3. 빈 배열과 빈 원소
26-4. 아주 오래된 친구: 버블 정렬(Bubble Sort)
26-5. 복잡한 배열 어플리케이션: 에라토스테네스의 체(Sieve of Erastosthenes)
26-6. 복잡한 배열 어플리케이션: 기묘한 수학 급수 탐색(Exploring a weird mathematical series)
26-7. 2차원 배열을 흉내낸 다음, 기울이기(tilting it)
28-1. 특정 PID와 관련있는 프로세스 찾기
28-2. 온라인 연결 상태
29-1. 쿠키 항아리를 숨기기
29-2. /dev/zero로 스왑 파일 세팅하기
29-3. 램디스크 만들기
30-1. 버그 있는 스크립트
30-2. test24, 버그가 있는 다른 스크립트
30-3. "assert"로 조건을 테스트하기
30-4. exit 잡아채기(Trapping at exit)
30-5. Control-C 가 눌렸을 때 깨끗이 청소하기
30-6. 변수 추적하기
32-1. 서브쉘 함정(Subshell Pitfalls)
34-1. 쉘 래퍼(shell wrapper)
34-2. 조금 복잡한 쉘 래퍼(shell wapper)
34-3. awk 스크립트 쉘 래퍼(shell wrapper)
34-4. Bash 스크립트에 내장된 펄
34-5. 하나로 묶인 Bash 스크립트와 펄 스크립트
34-6. 자신을 재귀적으로 부르는 스크립트
35-1. 문자열 확장
35-2. 간접 변수 참조 - 새로운 방법
35-3. 배열과 약간의 트릭을 써서 한 벌의 카드를 4명에게 랜덤하게 돌리기
A-1. manview: 포맷된 맨 페이지를 보는 스크립트
A-2. mailformat: 이메일 메세지를 포맷해서 보기
A-3. rn: 간단한 파일이름 변경 유틸리티
A-4. encryptedpw: 로컬에 암호화 되어 있는 비밀번호로 ftp 사이트에 파일을 업로드하는 스크립트
A-5. copy-cd: 데이타 CD를 복사하는 스크립트
A-6. days-between: 두 날짜 사이의 차이를 계산해 주는 스크립트
A-7. behead: 메일과 뉴스 메세지 헤더를 제거해 주는 스크립트
A-8. ftpget: ftp에서 파일을 다운로드 해 주는 스크립트
A-9. password: 8 글자짜리 랜덤한 비밀번호 생성 스크립트
A-10. fifo: 네임드 파이프를 써서 매일 백업해 주는 스크립트
A-11. 나머지 연산자로 소수 생성하기
A-12. tree: 디렉토리 구조를 트리 형태로 보여주는 스크립트
A-13. 문자열 함수들: C 형태의 문자열 함수
A-14. 객체 지향 데이타 베이스
F-1. 샘플 .bashrc 파일
G-1. VIEWDATA.BAT: 도스용 배치 파일
G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

처: 
http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/index.html 

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

vim 메뉴얼  (0) 2011.11.02
shell 조건식  (0) 2011.09.14
2>&1  (0) 2011.09.08
awk  (0) 2011.09.08
awk  (0) 2011.08.26
:

2>&1

OS/리눅스 & 유닉스 2011. 9. 8. 15:31
보통 파일하나 만들때
cat /dev/null > a.txt
라고 하면 0byte 짜리 a.txt 파일이 생기잖아요...

근데, 뒤에 2>&1 은 뭐죠?
어떨때 사용하는 건가요?

shell redirection 을 공부하시면 됩니다 . man bash

간단하게 얘기하면

1 은 standard out - 표준출력

2 는 standard error - 표준 에러

2>&1 은 표준 에러를 표준 출력으로 redirection 하는 거지요.

예를 들면 

 $ echo hi > hi.txt // 1> hi.txt 에서 1을 생략해도 됩니다. 표준 출력을 hi.txt 에 저장 
$ cat hi.txt
hi
$ cat hi.txt > /dev/null  // 표준 출력을 /dev/null 로 리다이렉션합니다. 결과없음
$ rm hi.txt  // hi.txt 를 지웁니다
$ cat hi.txt  
cat: hi.txt: No such file or directory // 에러출력입니다.
$ cat hi.txt >/dev/null
cat: hi.txt: No such file or directory // 위와 같은 에러
$ cat hi.txt > /dev/null 2>&1  // 표준 에러를 표준 출력으로 redirection
$  // 아무런 출력이 없습니다.
$ rm hi.txt 
$ rm hi.txt 
rm: cannot remove `hi.txt': No such file or directory 
$ rm hi.txt > hi_err.txt 2>&1 // 위의 에러를 표준 출력으로 돌려  hi_err.txt 로 저장  
$ cat hi_err.txt 
rm: cannot remove `hi.txt': No such file or directory 

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

shell 조건식  (0) 2011.09.14
Bash를 이용한 쉘 스크립팅  (0) 2011.09.08
awk  (0) 2011.09.08
awk  (0) 2011.08.26
vim  (0) 2011.08.23
:

awk

OS/리눅스 & 유닉스 2011. 9. 8. 13:44

awk는 명령어를 사용하다보면, 의외로 자주쓰는데, 지금까지 얼추 맞춰서 쓰다가 문서는 찾았습니다만, 위키에 없어서 찾은것들을 정리해서 글을 씁니다. 공개되어있는 문서를 찾아서 했기에, 절대 창작문서가 아닙니다.

조금 길어지다 보니.. 형식이 마구 틀어지고, 테이블 무서지고 있습니다... 그런데, 위키초보라서 잡기가 매우 힘들군요... 좀.. 도와주세요 ㅠ.ㅠ --maylinux

1 Awk란? 

awk는 프로그램 툴이다. 이 툴은 상당히 배우기 쉽고, 사용하기가 편리하다. 왜 그럴까? awk는 기본적으로 데이터 처리를 위한 상당히 잘 만들어진 프로그래밍 모델을 가지고 있다. 이 말은 돌려서 얘기한다면, 일반적인 프로그램을 짜기에는 불편하다는 얘기가 될수 있다. 즉 perl에서 지원하는 여러가지 API 함수를 이용한 프로그램이나, 복잡한 정규표현식을 처리하기에는 많은 어려움이 있다는 것이다. 즉, awk는 awk 나름대로의 용도라는 것이 있다는 말이다. 물론 awk 가지고도 여러가지 복잡한 일반 프로그래밍이 가능하지만, 솔직히 이러한 것을 처리할때에는 awk 보다는 다른 프로그램을 사용하는 것이 좋다. 일단 간단히 얘기하자면, awk는 데이터 양식의 문서나 또는 자료를 처리하여 다른 형태의 문서 또는 결과물을 출력하는데 쓰인다. 실제로 awk의 프로그램 동작 모델은 이것을 위해 아주 잘 만들어져 있다. 뭐, 잘 만들어져 있는지 아닌지는 다음의 글들을 읽어야 알겠지만, 일단은 그렇다는 걸 기억해두기 바란다.


2 awk의 구조(Model) 

awk는 위에서 언급한 바와 같이 데이터 처리를 위해 최적화되어 있다고 했다. 그러면, 어떠한 모델이 데이터 처리에 적합한 것일까? 일단 아래의 내용을 보고 나서 계속 설명하겠다.

1. 시작(BEGIN) : 입력데이터를 실행하기에 적합한 형태로 바꾸어주는 단계이다. 프로그램적인 말로는 preprocess라고 한다.

2. 실행(Routine) : [시작 단계]에서 잘 처리된(정규화된) 데이터를 실제 루틴으로 처리하는 것이다. 여기서 데이터는 처리 루틴에 따라 처리가 되며, 입력값이 루틴을 거쳐 결과값이 나오게 된다.

3. 끝(END) : [시작 단계]와 마찬가지로, 데이터가 처리된 후에 처리해야 할 내용들을 담고 있다. 결과의 추가 출력들을 예로 들 수 있다.


3 awk 프로그램 

3.1 일반적인 awk 의 용도 및 사용방법(Using Model) 

awk는 일반적으로 데이터 또는 유사 데이터양식의 파일 및 자료를 처리하는데 쓰인다. 예를 들어 통계 자료나, text 형식의 access(MicroSoft), 실험식의 계산 결과 등을 통계를 낸다던지 비교 분석 한다던지 다른 형태의 문서(결과물)로 변환하는 등의 작업에 사용된다. 따라서 이러한 작업에 있어서 awk는 100%의 작업효율을 가져올수 있다. 물론 perl이나, 유사프로그램을 사용해도 좋지만, 특별하게 복잡한 구조를 가지지 않는다면, 굳이 "토끼 잡는데, 소잡는 칼을 쓸 이유는 없다"는 것이다. awk만으로 충분하며, 또한 sed나 다른 GNU 유틸을 병합하여 사용하는 것이 단일 perl 프로그램이나, 기타 데이터 처리 프로그래밍 언어를 사용하는 것보다 훨씬 낫기 때문이다.

개인적인 관점으로는 GNU 유틸들은 상당히 유연하고(flexible)하고, 간편하지만, 실제적으로 개개의 GNU 유틸로 작업을 하기에는 상당히 힘이 든다. 그러나, 이들 GNU 유틸들을 적절하게 조합하여 사용하면, 기존의 여타 프로그램들과 동등한 기능을 발휘하는 멋진 프로그램이 될 수 있는 것이다.

그래서 보통의 작업은 awk 하나만 가지고, 모두 다 처리할 수가 없다. 하고자 하는 일의 일부분을 awk가 맡을수 있는 것이다. 보통의 일반적인 awk의 사용은 다음과 같은 단계를 거치게 된다.

  1. egrep 및 grep 을 이용한 데이터 파일의 구조 확인을 한다.
  2. 정규화가 가능한지를 확인하고, sed로 테스트 해본다. awk가 처리할만큼 정규화가 되어 있다면, 바로 awk를 사용한다.
  3. sed로 정규화된 양식을 awk로 처리한다. 

데이터의 양식 데이터는 일반적으로 Record와 Fields를 가진다. 일반적으로 한라인(한줄)이 1 record가 되고, Fields의 구분은 "□"(공백문자)를 구분자로 하게 된다. (레코드와 필드에 대해서 이해가 가지 않는 사람은 DataBase에 대한 개요 등을 참고하기 바란다.)

일반적으로 awk가 처리할 수 있는 데이터의 형식은 다음과 같다.

■■■□■■■■□■■■□■■■□■■■■■■□■■■■
■■■■□■■□■■■■■■■□■■■■□■■□■■■■
■■□■■■■■■■■■□■■□■■□■■■■■■■■□■

위의 데이터는 아래의 형식으로 바뀌게 된다.

record1: ■■■ ■■■■ ■■■ ■■■ ■■■■■■ ■■■■
record2: ■■■■ ■■ ■■■■■■■ ■■■■ ■■ ■■■■
record3: ■■ ■■■■■■■■■ ■■ ■■ ■■■■■■■■
Field 1 Field 2 Field 3 Field 4 Field 5 Field 6
$1 $2 $3 $4 $5 $6

(위의 표가 잘 이해되지 않는다면, DB 입문서 등을 읽어보도록 한다.)

각 라인이 한 레코드가 되며, 스페이스로 분리된 문자열이 Field(또는 Column)으로 나뉘게 된다. 실제로는 한 레코드가 한 라인과 일지 않을 수도 있으며, Field 를 구분하는 것도 공백문자가 아닐수도 있다. 자세한 내용은 다음의 예제를 보면서 이해를 할 수 있을 것이다.

3.2 Example 1 - 간단한 awk 사용 

# cat exam_result.dat
박종규 95점
이억운 98점
이훈강 99점
엄성기 100점
정영원 97점
박오근 98점
여기서 각 줄이 한 레코드가 된다. 그리고, "박종규 95점"이란 내용에서 "박종규", "95점"이란 문자열이 각각의 필드(항목)가 되는 것이다.

간단히 이름을 출력해 보기로 하자
# awk '{print $1}' exam_result.dat
박종규
이억운
이훈강
엄성기
정영원
박오근
print 명령은 간단히 처리중에 필요한 내용을 출력하는 함수이다. "$1"은 1st(첫번째) 필드를 지시한다. 마찬가지로 점수를 출력하려면, "$1" 대신에 "$2"를 입력하면 된다. 그러면, 라인의 전체 내용을 출력하려면 어떻게 해야 하는가? "$0"를 사용하면, 라인의 전체 내용을 출력할 수 있다.

이제 여기에서 시험친 사람들의 총점을 구하려고 한다. 어떻게 해야 할까? 일단 합계는 숫자만이 가능한데, 현재는 "95점", "98점"과 같이 "점"이라는 글자가 포함되어 있어, 필드로 구분해 내어도 계산이 불가능하다. 그러면, 일단 sed 프로그램을 사용해 "점"이라는 글자를 삭제하여 연산이 용이하도록 만들어보자.

sedscr의 내용
# cat sedscr
s/점$//

# sed -f sedscr exam_result.dat
박종규 95
이억운 98
이훈강 99
엄성기 100
정영원 97
박오근 98
자 이제 계산할 수가 있을 듯 하다. 그러면, 프로그램을 짜보자.
# sed -f sedscr exam_result.dat | awk 'BEGIN{ sum = 0; print "총점 출력 프로그램"; } {sum += $2} END {print "합계 : " sum}'
총점 출력 프로그램
합계 : 587
위의 내용을 설명하도록 하면 다음과 같다.

BEGIN{ sum = 0; print "총점 출력 프로그램"; } 위에서 언급된 awk의 모델링에서 BEGIN 부분에 해당한다. 루틴이 돌아가기 이전에 필요한 작업을 이 부분에 기재할 수 있으며, 출력의 머릿말 등을 달아둘 수 있다. 합계를 내기 위한 변수 sum을 지정하고, 그 값을 0으로 초기화하였다.

{sum += $2} 실제 프로그램 내용이다. 위에서 Routine(루틴)이라 설명한 곳이다. 이 부분은 한 필드마다 적용이 되며, 함수나 루틴을 사용하여 필요한 작업을 수행한다. 현재의

END {print "합계 : " sum} 위에서 언급한 END(마지막) 처리 부분이다. 모든 연산이 끝나고 난 다음 마지막 출력 양식이라든지 결과값을 출력한다. 현재 소스는 합계 내역을 출력한다.

위의 소스는 알아보기 힘들기 때문에, awk 코드 부분을 파일로 저장하여 실행하는 방법을 써보도록 하자.

아래의 내용으로 sum.awk 파일을 작성해 보자
#!/bin/awk
#
# This Program is for Summing of exam_result.
#

# BEGIN : 프로그램 시작 처리
BEGIN {
    sum = 0;
    print "총점 출력 프로그램";
}

# ROUTINE : 프로그램 본문
{
    sum += $2;
}

# END : 프로그램 마무리 처리
END {
    print "합계 : " sum;
}
위에서 첫줄의 #!/bin/awk는 앞으로의 내용들은 /bin/awk 프로그램을 사용해서 번역(처리)을 하겠다라는 지정 구문이다. 쉘스크립트의 "#!/bin/sh"와 같은 역할을 한다고 생각하면 될 것이다. 첫줄 이외에 "#"으로 시작하는 문장들은 모두 주석이다. 프로그램의 설명이나, 함수, 루틴에 대한 설명을 적어둔다. 각 내용은 한줄이 끝날때마다 ";"(세미콜론)을 붙여서 분리를 한다.

자, 위의 awk 스크립트 파일로 실행을 해 보기로 하자.
$ sed -f sedscr exam_result.dat | awk -f sum.awk 
awk 스크립트 파일을 호출할 때에는 "-f 파일이름" 옵션을 사용한다는 것을 기억해야 한다.

자, 그러면 이 프로그램에서 평균은 어떻게 구할 수 있을까? 이미 눈치를 챈 사람들이 있을 것이다. sum.awk 파일을 수정해 보자.
#!/bin/awk
#
# This Program is for Summing of exam_result.
#

# BEGIN : 프로그램 시작 처리
BEGIN {
    sum = 0;
    print "총점 출력 프로그램";
}

# ROUTINE : 프로그램 본문
{
    sum += $2;
}

# END : 프로그램 마무리 처리
END {
    print "합계 : " sum;
        average = sum / NR;
    print "평균 : " average;
}
실행을 하면 아래와 같이 된다.
$ sed -f sedscr exam_result.dat | awk -f sum.awk 
총점 출력 프로그램
합계 : 587
평균 : 97.8333

3.3 awk의 내부변수 

awk에는 awk가 내부적으로 가지는 변수들이 있다. 이 변수들을 사용하여, 필드 및 레코드의 구분을 좀더 다양하게 할 수 있으며, 좀더 flexible(유연한)프로그램을 짤 수가 있다. 아래에 각 내부 변수들에 대해서 설명해두었다.

FS 필드 구분자 - Fields Seperator
RS 레코드 구분자 - Records Seperator
NF 현재 레코드의 필드수(Number of Fields)
NR 현재 파일에서 레코드 넘버(Number of Records)
FNR 입력파일이 여러개인 경우에 현재 파일에서의 NF를 표시한다.
OFS 출력시의 FS(Output Fields Seperator). 이 값을 변경하게 되면, 출력시의 FS 가 바뀌게 된다.
ORS 출력시의 RS(Output Records Seperator). 이 값을 변경하게 되면, 출력시의 RS 가 바뀌게 된다.

3.4 Example 2 - awk 프로그램 응용 

여기서 FS 와 RS 에 대한 부가 설명을 해야 할 것 같다. 일반적으로 데이터는 보통 한 라인이 한 레코드에 해당하고, 빈칸이나, 탭 등이 필드를 구분한다. 그러나, 실제로 데이터파일에서 이런식으로 처리가 되지 않는 경우가 있으며, 굳이 데이터 파일만이 아니라, 다른 형식의 파일도 처리하기 때문에 FS, RS는 임의 설정이 가능해야 한다. 예를 들어 다음과 같은 명함 목록 파일을 보자.
# cat cards.dat
백종규
리눅스넷(주)
부산 광역시 연제구 연산동 한창 빌딩 432호
051-851-2761

김진욱
이지시스템
서울시 서초구 방배2동 450-3 3층
02-3473-6282
위의 데이터 파일은 한줄이 한 레코드가 되지 않는다는 걸 알수 있다. 한 레코드는 한줄이 비워진 줄, 즉 정규식으로 표현하자면 "\n\n"으로 구분되어 있으며, 레코드내에서 필드의 구분은 개행("\n")으로 구분된다. 따라서, 위의 데이터에서 이름과 전화번호만을 출력하고 싶다면, 다음과 같이 awk 스크립트를 작성할 수 있다.
#!/bin/awk
BEGIN { 
        RS = "\n\n"; 
        FS = "\n"; 
}
{ 
        print $1, $NF; 
}
위의 스크립트에서 BEGIN 부분에서 RS와 FS를 임으로 "\n\n"과 "\n"으로 변경하였다. 또한 루틴부분에서는 첫번째 필드($1)와 마지막 필드($NF)의 내용을 출력하도록 하였다. NF현재 레코드에서 필드의 숫자를 나타낸다. 여기서 인자값을 호출하는 "$"을 붙이게 되면, 마지막 필드값이 출력이 되는 것이다.


4 또다른 요약 페이지 

  1. awk는 직접 사용자로부터 입력을 받거나 아니면 지정한 파일을 가공하여 표준 출력한다. 표준 출력을 리다이렉션할 수 있다 

  2. 사용법
    • awk [옵션] '스크립트' [-v 변수=값] [파일(들)]
    • awk [옵션] -f 스크립트 파일 [-v 변수=값] [파일(들)]
    • cf) 편집 스크립트 파일의 사용법
      • ed : ed -s(script) sourcefile < scriptfile
      • sed : sed -f(file) scriptfile sourcefile > outputfile
      • awk : awk -f(file) scriptfile sourcefile > outputfile 

  3. 옵션
    • -Fc : field separator 지정
      • c는 필드 사이를 구분하는 구분자이다
      • 직접 지정하지 않으면 공백을 기준으로 한다
      • 시스템 변수 FS를 지정하는 것과 같은 효과를 지닌다
    • -v 변수 = 값
      • 스크립트를 실행하기 전에 미리 변수를 지정하여 준다
      • $를 쓰지 않고 변수 이름만 쓰면 된다. C에서 #define처럼 생각하면 될 것이다.
    • -f 스크립트 파일
      • 스크립트를 파일에서 가져온다
      • -f 옵션을 여러번 사용하여 여러개의 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다 

  4. 스크립트
    • 패턴 { 동작 }
      • 커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표로 묶는다
      • 패턴만 있는 경우 : 패턴과 일치하는 레코드(라인)를 화면에 출력한다
      • 동작만 있는 경우 : 모든 레코드(라인)가 동작의 대상이 된다 

    • 패턴
      • /정규표현식/ sed가 지원하지 않는 +, ?, |, ( ) 등의 메타문자도 지원한다 또한 ^, $를 각 필드의 처음과 끝을 의미하도록 사용할 수도 있다
      • 비교연산 숫자 기준, 알파벳 기준 모두 사용 가능하다
      • 패턴 매칭 연산 ~ : 일치하는 부분을 나타낸다 !~ : 일치하지 않는 부분을 나타낸다
      • BEGIN 첫 번째 레코드가 읽혀지기 전에 어떤 동작을 정의하여 사용하고 싶을 때 사용한다
      • END 마지막 레코드가 모두 읽혀진 후 어떤 동작을 정의하여 실행하고 싶을 때 사용한다 

  5. 동작
    • 동작은 모두 { }로 둘러싸야 한다
    • 예제
      • good이라는 문자열을 포함하는 모든 레코드를 출력할 때 /good/
      • 각 레코드의 첫 번째 필드를 출력할 때 { print $1 }
      • good이라는 문자열을 포함하는 레코드의 첫 번째 필드를 출력할 때 /good/ { print $1 }
      • 두 개 이상의 필드를 가지는 레코드를 전부 출력할 때(비교연산) NF > 2
      • 한 라인(\n)을 필드로, 빈 라인("")을 레코드로 구분할 때 BEGIN { FS = "\n" ; RS = ""}
      • 첫 번째 필드가 good와 일치하는 레코드에 대해 세 번째 필드를 먼저 출력하고 두 번째 필드를 나중에 출력하고 싶을 때 $1 ~ /good/ { print $3 , $2 }
      • good이라는 문자열이 몇 개나 들어가 있는지 계산하여 마지막 부분에서 출력하고 싶을 때 /good/ { ++x } END { print x }
      • 두 번째 필드를 모두 합하고 마지막 부분에서 두 번째 필드의 총합계를 출력하고 싶을 때 { total += $2 } END { print "Total of $2: " , total }
      • 레코드의 길이가 20자 이하인 것을 출력하고 싶을 때 length($0) < 20
      • 네 개의 필드를 가지며 good이라는 단어로 시작하는 모든 레코드를 출력하고 싶을 때 NF == 4 && /^good/
      • 빈줄을 제외한 모든 줄을 화면에 출력한다 NF > 0 

  6. awk 시스템 변수
    FILENAME 현재 파일명 $0 입력 레코드
    FS 입력 필드 구분 디폴트 : 공백 $n 입력 레코드의 N번째 필드
    NF 현재 레코드 필드 갯수 ARGC 커맨드 라인의 인자 갯수
    NR 현재 레코드 번호 ARGV 커맨드 라인 인자를 포함하는 배열
    OFMT 숫자에 대한 출력 포맷 디폴트 : %.6g ENVIRON 환경변수들을 모아둔 관계형 배열
    OFS 출력 필드 구분 디폴트 : 빈줄 FNR NR과 동일 단지 현재 파일에 적용된다는 점이 다름
    ORS 출력 레코드 구분 디폴트 : newline RSTART 지정한 매칭 연산을 만족하는 문자열의 맨 앞부분
    RS 입력 레코드 구분 디폴트 : newline RLENGTH 지정한 매칭 연산을 만족하는 문자열의 길이

  7. awk 연산자
    • 산술 : =, +=, -=, *=, /=, %= 조건 : ? : 논리 : ||, &&, ! 패턴 : ~, !~
    • 비교 : <, <=, >, >=, !=,== 증감 : ++, -- 필드참조 : $
  8. 제어문(C의 제어문과 같다)
    • break
    • continue
    • do {실행} while (조건)
    • exit
    • for (관계형 배열의 요소) {실행}
    • 펄의 foreach와 같다
    • if (조건) {실행} else {실행}
    • return
    • while 

  9. awk 명령어
    • 문자열 연산
      • gsub(reg,s) 입력 문자열의 전반에 걸쳐 정규표현식 r을 문자열 s로 대치한다.
      • gsub(reg,s1,s2) 문자열 s2에서 정규표현식 r을 s1으로 대치한다.
      • index(s1,s2) s1에서 s2의 위치를 넘겨준다. 만약 없다면 0을 넘겨준다.
      • length(arg) 인자의 길이를 넘겨준다.
      • match(s,r) 문자열 s에서 정규표현식 r과 매칭되는 부분의 위치를 넘겨준다.
      • split(string,array[,seperator]) 구분자를 기준으로(지정하지 않으면 공백 기준)해서 지정한 문자열을 배열로 만든다 배열[1], 배열[2], .......
      • sub(r,s), sub(r,s1,s2) gsub과 동일하다. 단지 정규표현식과 일치하는 문자열이 여러 개라도 처음 문자열만 대치된다
      • substr(s,m) 문자열 s에서 m번째 위치에서 끝까지의 문자를 리턴한다
      • substr(s,m,n) 문자열 s에서 m번째 위치에서 n번째까지의 문자를 리턴한다
      • tolower(str)
      • toupper(str) 

    • 수치 연산
      • atan2(x,y) y/x의 arctangent값을 라디안 단위로 넘겨준다
      • cos(x)
      • exp(arg)
      • int(arg)
      • log(arg)
      • rand() 0과 1사이의 난수를 발생한다
      • sin(x)
      • sqrt(arg)
      • srand(expr) 인자를 가지고 난수를 발생시킨다. 인자가 주어지지 않으면 시간을 가지고 난수를 발생시킨다. 

    • 입출력/프로세스
      • close(filename) 지정한 파일을 닫는다
      • close(cmd) 지정한 명령어 파이프를 닫는다
      • delete array[element] 지정한 배열 요소를 지운다
      • getline() 다음 레코드를 읽어 들인다
      • getline[variable] [< "filename"] 파일에서 읽어들인다
      • next 다음 레코드(라인)을 입력받는다 getline()과 유사하지만 /패턴/동작을 새롭게 시작한다 getline()은 다음 라인을 읽기만 한다
      • print [args] ![> "filename"] 인자를 출력한다
      • printf "format" [,expressions] ![> "filename"] 형식에 맞춰 출력한다
      • sprintf (format [,expressions]) printf와 마찬가지로 사용하는데 값을 리턴하기만 하고 출력은 하지 않는다.
      • system(command) 시스템 내부 명령어를 실행한다 

  10. 간단한 예
    • awk ' BEGIN { for (i = 1;i<=7,i++) print int(101*rand()) }' 화면에 1이상 100이하의 난수 일곱 개를 출력한다
    • ls -l file1 file2 file3 | awk ' { x += $5 } ; END { print "Total bytes : " x } ' 파일들의 크기를 모두 합하여 총 바이트 수를 표시한다
    • awk ' END { print NR } ' filename 지정한 파일의 라인이 몇 개인지를 표시한다
    • awk ' NR % 2 == 0 ' 지정한 파일의 짝수번째의 라인만을 출력해 준다 


배열이 썩 훌륭하게 지원되는데 세부 동작이 좀 예상 밖입니다. for(var in arr)를 돌리면 var에 1,2,3,...이 들어갈 뿐입니다. awk에서 배열의 특성 때문인데 정확한 건 메뉴얼을 찾아보도록 하고, 여기서는 배열을 한 번 뒤집어서 흔히 생각하는 반응대로 쓰는 법을 소개합니다. 이는 메뉴얼에도 나와 있는 내용입니다.

split(string, tmp)
for (var in tmp) {
    new[tmp[var]] = var
    delete tmp[var]
}

split은 문자열을 쪼개는 것으로 세 번째 인자에 구분자를 주면 그것에 맞춰 쪼개고, 아니면 FS에 지정된 걸로 동작합니다. 그리고 그 배열을 훑어서 tmp의 key와 value를 반대로 다른 배열에 저장하고 tmp를 지웁니다. 그 다음에 for(var in new)라고 하면 애초에 string에 있던 값들이 var에 들어갈 겁니다.

출처:
http://wiki.kldp.org/wiki.php/Awk
 

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

Bash를 이용한 쉘 스크립팅  (0) 2011.09.08
2>&1  (0) 2011.09.08
awk  (0) 2011.08.26
vim  (0) 2011.08.23
[Linux/Unix]쉘 (Shell) 의 정의와 종류  (0) 2011.08.23
:

awk

OS/리눅스 & 유닉스 2011. 8. 26. 17:34

Shell Programming 뿐만 아니라 기본적으로 로그 파일 변환 및 필터링시 유용하면 아주 강력한 Awk 유틸리티에 대한 일반적인 내용을 다룹니다.

문법

BEGIN : 실행하기전 전처리 단계 preprocess 
ROUTINE {} : 수행
END : 처리 후 수행

ex)

$ cat sedscr
aa 90
bb 30 
dd 99

$ cat sedscr | awk 'BEGIN{ sum = 0; print " "; } {sum += $2} END {print " : " sum}'
  : 219

ex - file version)

$ cat sum.awk
#!/bin/awk
#
# This Program is for Summing of exam_result.


# BEGIN : 
BEGIN {
sum = 0;
print " "; 
}

# ROUTINE : 
{
sum += $2;


# END :
END {
print " : " sum;
average = sum / 3;
print " : " average;
}

$ cat sedscr | awk -f sum.awk
  : 219 : 73

 

내부 변수

FS : - Fields Seperator : BEGIN에서 재정의 함으로써 구분자를 바꿀수 있다.
RS : - Records Seperator : BEGIN에서 재정의 함으로써 레코드 구분자를 바꿀 수 있다.
NF : (Number of Fields)
NR : (Number of Records)
FNR : 입력파일이 여러개 인경우 현재 파일에서 NF를 표시한다.
OFS : FS( Output Fields Seperator ). 출력시의 FS
ORS : RS( Output Records Seperator ). 출력시의 RS
FILENAME : 현재 파일명

 

기타


스크립트
 

  1. 패턴 {동작}
    패턴, 동작 전체를 단일 따옴표로 묶어야한다.
    특정 패턴에 대해 동작하게 한다.
    패턴이 없으면 모든 레코드에 대해 동작한다.
  2. 패턴
    /정규표현식/ : sed가 지원하지 않는것까지 모두 지원
    비교연산 : 숫자 문자 비교 가능
    패턴매칭연산 : ~ 일치하는 부분, !~ 일치하지 않는 부분
    BEGIN : 레코드 읽기전 할일
    END : 레코드 읽고 나서 할일


동작
 

  1. 모두 {}로 둘러싸여야한다.
    ex)
    > good이라는 문자열을 포함한 모든 레코드 출력
    /good/
    > good이라는 문자열을 포함한 첫번째 레코드 출력
    /good/ {print $1}
    > 두개 이상의 필드를 가지는 모든 레코드 출력
    NF > 2
    > 한라인을 필드로, 빈라인을 레코드로 구분
    BEGIN {FS="\n";RS=""}

    /good/ {++x} END {print x}
    { total += $2 } END { print "Total of $2: " , total }
    length($0) < 20 /* 라인의 길이가 20이하인 것 출력 */
    NF == 4 && /^good/
    NF > 0

연산자
 

  1. 산술 : =, +=, -=, *=, /=, %=
  2. 조건 : ? : 논리: ||, &&, ! 패턴: ~, !~
  3. 비교 : <, <=, >, >=, !=,==
  4. 증감 : ++, -- 필드 참조 : $
  5. 제어문 (C의 제어문과 같다)
    break
    continue
    do {실행} while (조건)
    exit
    for (관계형 배열의 요소) {실행}
    펄의 foreach와 같다
    if (조건) {실행} else {실행}
    return
    while


명령어

  1. 문자열연산
    gsub(reg,s) : 정규식 r을 s로 치환
    gsub(reg,s1,s2) : s2에서 정규식 r을 s1으로 대치한다.
    index(s1,s2) : s1에서 s2의 위치 넘겨줌 없음 0
    length(arg)
    match(s,r) : r의 매칭되는 부분의 위치를 넘겨줌
    split(string,array[,seperator]) : 구분자를 기준으로(디폴트 공백)해서 지정한 문자열을 
    배열로 만든다.
    sub(r,s), sub(r,s1,s2) : gsub와 동일하나 여러개 일치해도 처음것만 실행
    substr(s,m) : s에서 m번째 부터 끝까지 문자 리터
    substr(s,m,n) : m에서 n까지
    tolower(str)
    touper(str)
  2. 수치 연산
    atan2(x,y) : y/x의 arctangent 값을 라디안 단위로 넘겨준다.
    cos(x)
    exp(arg)
    int(arg)
    log(arg)
    rand() : 0과 1사이의 난수를 발생
    sin(x)
    sqrt(arg)
    srand(expr)
  3. 입출력 프로세스
    close(filename) : 지정한 파일 닫는다.
    close(cmd) : 명령어 파이프 닫는다
    delete array?element : 지정한 배열 요소 지운다
    getline() : 다음 레코드 읽어 들인다.
    getline?variable [< "filename"] : 파일에서 읽어 들인다.
    next : 다음 레코드(라인)을 입력받는다, getline과 비슷하지만 /패턴/동작을 새롭게 시작>
    한다.
    print ?args ?> "filename" : 인자를 출력한다.
    printf "format" [,expressions] ?> "filename" : 형식에 맞춰 출력
    sprintf (format [,expressions]) : 출력은 안하고 리턴만한다.
    system(command) : 시스템 내부 명령어 실행
  4. 예제
    awk ' BEGIN { for (i = 1;i<=7,i++) print int(101*rand()) }'
    ls -l file1 file2 file3 | awk ' { x += $5 } ; END { print "Total bytes : " x } '
    awk ' END { print NR } ' filename
    awk ' NR % 2 == 0 '

 
출처 : http://yaaong.tistory.com/32

 

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

2>&1  (0) 2011.09.08
awk  (0) 2011.09.08
vim  (0) 2011.08.23
[Linux/Unix]쉘 (Shell) 의 정의와 종류  (0) 2011.08.23
[Linux/Unix]쉘 변수($#, $*, $$, $!)  (0) 2011.08.23
: