리눅스 OS 버전

cat /proc/sys/kernel/osrelease

cat /etc/redhat-release

cat /proc/version

uname -옵션

-a : 모든정보

-m : 하드웨어종류

-n : 호스트이름

-p : 소유자 이름

-r : 현재 버전

cpu정보

cat /proc/cpuinfo

dmesg | grep CPU
CPU: Intel(R) Xeon(TM) CPU 3.00GHz (2992.51-MHz K8-class CPU)
Hyperthreading: 2 logical CPUs
cpu0: <ACPI CPU> on acpi0
acpi_throttle0: <ACPI CPU Throttling> on cpu0

메모리 정보

cat /proc/meminfo

dmesg | grep memory

운영체제 확인

cat /etc/issue.net

HDD 용량 확인

df -h

HDD 확인

dmesg | grep SCSI

하드 디스크 정보(scsi)
cat /proc/scsi/scsi
ide일 경우(모델보기)
cat /proc/ide/hda/model (첫번째 하드 hda인경우)
/proc/ide/ 아래에는 하드 갯수 확인
/proc/ide/hda/ 아래에는 하드 정보
raid를 사용시

cat /proc/mdstat
네트워크 정보
cat /proc/net/netlink

출처 :

http://sjunious.egloos.com/980953

http://knight76.tistory.com/1134

http://the7dayz.tistory.com/2

'OS > LINUX' 카테고리의 다른 글

vmstat 과 sar 명령  (0) 2012.06.01
iostat  (0) 2012.06.01
리눅스 NFS 설정하기  (0) 2012.05.18
locate 명령어 사용법  (0) 2011.06.29
부팅시 자동실행 서비스 관리 ( ntsysv, chkconfig )  (0) 2011.06.21

출처 kal2suma의 공부터 | 하기나름
원문 http://blog.naver.com/kal2suma1205/100002345091
프로세스
지금 터미널에서 ps 명령을 실행하면 수많은 프로세스가 떠 있음을 알수 있다. 프로세스란 시스템상에서 어떠한 명령을 실행함으로써 사용자와 OS, OS 와 시스템 간의 대화가 가능하도록 해주는 실행 객체이다.
이러한 프로세스는 여러분이 이미지를 보거나, 웹서핑을 하거나, 음악을 듣거나 혹은 웹서비스를 하는등 각 객체의 특성에 따라 다양한 업무를 수행하게 된다.
[root@localhost root]# ps -aux
 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 1384 520 ? S 21:37 0:04 init
root 2 0.0 0.0 0 0 ? SW 21:37 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SW 21:37 0:00 [kapm-idled] 
root 4 0.0 0.0 0 0 ? SWN 21:37 0:00 [ksoftirqd_CPU0] 
root 5 0.0 0.0 0 0 ? SW 21:37 0:00 [kswapd]
 ...
root 930 0.0 0.3 2920 1016 tty1 S 21:39 0:00 /bin/sh /usr/X11R 
root 937 0.0 0.2 2320 672 tty1 S 21:39 0:00 xinit /etc/X11/xi 
root 938 0.7 5.9 74844 15056 ? S< 21:39 0:34 /etc/X11/X :0 
root 946 0.0 0.4 2956 1108 tty1 S 21:39 0:00 /bin/bash /usr/bi 
root 1011 0.0 1.9 16044 5020 ? S 21:39 0:00 kdeinit: Running.
... 
그런데 이러한 프로세스가 어느순간 갑자기 생기진 않았을것이다. 최초의 어느한 시작점이 있을것이다. 이 시작점에 대해서 알아보자

init 프로세스
모든 프로세스는 위에서 처럼 PID를 가지고 또한 PPID 를 가진다. PID란 프로세스자신을 가리키는 일련의 번호이며 PPID란 자신을 실행시킨 부모프로세스의 PID를 가리킨다.
그렇다면 자신의 부모 프로세스를 실행시킨 프로세스가 존재할것이고, 또 그 부모 프로세스를 실행한 프로세스가 존재할것이다.
이런 식으로 유추해서 생각해 보면 결국 최초의 조상 프로세스가 존재할것이라는 결론에 도달할수 있을것인데(인류로 생각해보자면, "아담" 정도), 그것이 바로 PID 1번을 가지는 init 프로세스이다.
모든 프로세스는 init 로부터 fork & exec 과정을 거쳐서 독립된 프로세스로 임무를 수행하게 된다.

fork 와 exec
그럼 fork 와 exec 에 대해서 좀 알아보도록 하겠다.
fork 와 exec 는 둘다 유닉스 시스템에서 새로운 프로세스를 생성시키기 위해서 사용하는 System Call 함수들이다.
둘다 새로운 프로세스를 생성하는데 그 행동이 약간 다르다.
fork 의 경우는 어떤 프로세스에서 fork 를 실행하게 되면, 자신의 프로세스와 똑같은 프로세스를 copy-on-write 형식으로 실행하게 되며, 이때 생성된 프로세는 자신만의 PID를 가지고 독자적인 길을 가게 된다. 물론 이때 생성된 프로세서의 부모 프로세스는 최초에 실행된 프로세스가 될것이다.
우리는 이러한 최초의 프로세스를 부모 프로세스라고 하고 fork 되어서 만들어진 프로세스를 자식 프로세스라고 한다.

예제 fork.c
#include <unistd.h>
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
int pid; pid = fork();
 if (pid == -1) { perror("fork error ");
 exit(0); } // 자식프로세스일경우 
else if (pid == 0) 
{
printf("자식\n"); 
pause(); } // 부모프로세스의 경우 
else { printf("부모\n"); 
pause();
 } 
} 
위의 프로그램을 실행시키고
[root@localhost test]# ./fork 부모 자식 
ps 를 이용해서 확인해 보면 아래와 같은 ps 상태를 보여줄것이다.
[root@localhost root]# ps -efjc | grep fork | grep -v fork
UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD 
root 2375 1963 2375 1963 - 30 23:20 pts/6 00:00:00 ./fork
root 2376 2375 2375 1963 - 30 23:20 pts/6 00:00:00 ./fork 

보면 알겠지만 똑같은 이름의 프로세스가 2개 생성되었음을 알수 있으며, 2375 가 부모프로세스이고, 2376 이 2375 의 자식프로세스임을 PPID 정보를 이용해서 알수 있을것이다.
이처럼 fork 는 프로세스의 복사본을 만들때 사용한다.


이러한 fork 의 특성으로 다수의 클라이언트 연결을 처리해야 하는 네트웍서버 를 제작할때 매우 흔히 사용된다.


fork 함수를 실행하면 int 형의 정수를 넘겨주게 되는데, 0일경우 자식프로세스, 0보다 큰정수일경우 부모프로세스를 실행하게 된다.
여러가지 이유로 fork 가 실패한다면 -1 을 돌려주게 될것이다.

exec
exec 는 흔히 exec 계열함수군에 의해서 구현되며, exec 함수군에는 execl(3), execlp, execle.. 등이 있다. 모두 같은 일을 하며, 단지 프로그램실행 아규먼트를 다루는데 약간씩의 차이를 가지고 있을 뿐이다.
exec 역시 fork 와 마찬가지로 새로운 프로새스를 생성시키지만, fork 와 같이 copy-on-write 를 이용한 전혀 새로운 프로세스를 실행시키지 않고, 현재의 프로세스이미지를 새로운 프로세스 이미지가 덮어써 버린다.
다음의 예제를 컴파일한후 실행하면 이해가 쉬울것이다.

myexec.c

#include <unistd.h>
#include <string.h>
int main()
{
 printf("원래 프로세스 : %d\n", getpid());
 sleep(1); execl("/bin/sh", "sh", NULL);
 printf("I will be back\n"); // 실행될까 ?
 exit(0);
} 
위의 프로그램을 컴파일한후 실행시키면 "/bin/sh" 가 실행되고 쉘 프롬프트가 사용자 입력을 기다리는걸 볼수 있을것이다.
여기에서 exit 명령을 사용해서 쉘을 종료하면 어떻게 될까 ?
다음 의 printf 행을 실행해서 "I will be back" 라는 문장을 볼수 있게 될까 ?
대답은 아니오 이다. 이유는 위에서 설명했듯이, execl 함수를 호출해서 /bin/sh 를 수행한순간 myexec 프로세스를 /bin/sh 가 덮어써 버리기 때문이다.
ps 를 이용해서 한번 확인을 해보도록 하자.
먼저 ./myexec 를 실행시키고
[root@localhost test]# ./myexec 원래 프로세스 : 2447 sh-2.05# 

 

ps 를 이용해서 myexec 라는 이름의 process 라는 이름의 프로세스가 생성되었는지 알아보자.

[root@localhost root]# ps -aux | grep myexec
 root 2449 0.0 0.2 2492 684 pts/9 S 23:40 0:00 grep myexec 

나타나지 않음을 알수 있다. 그러면 pid 2447 번이 존재하는지 한번 확인해 보도록 하자.

[root@localhost root]# ps -aux | grep 2447
root 2447 0.0 0.5 3280 1356 pts/6 S 23:39 0:00 sh 

위의 결과를 보면 알겠지만 myexec 대신 execl 함수를 이용해서 실행시킨 sh 가 2447 프로세스를 완전히 덮어써 버렸음을 알수 있을것이다.

참 그리고 system(3) 이라는 새로운 프로세스를 시키는 함수도 있는데, fork & exec 의 다른 구현으로 보면 될것이며, 실제로 system 을 사용하지 않고, fork & exec 를 통하여 구현하는 경우도 있다.


위의 fork 와 exec 의 개념을 완전히 이해했다면 이제 단지 하나의 init 프로세스에서 다른 모든 프로세스가 fork & exec 방식으로 어떻게 파생되어서 실행되는지 감을 잡을수 있을것이다.
init 프로세스에게 어떤 프로세스를 실행시켜라는 메시지가 전달되면, init 는 fork 를 이용해서 자기자신을 복사한 자식 프로세스를 하나 실행시키게 될것이다. 그리고 나서 복사된 자식프로세스에서 exec 를 써서 새로운 프로세스를 실행시키면 init 는 새로운 프로세스로 대체실행되는 것이다.

 

 new_process 를 실행하라
 | 
 V 
+---------+ fork +---------+ exec(new_process) +-------------+ 
|init(1) |----->>| init(?) |-------------------->| new_process | 
+---------+ +---------+ +-------------+ 


프로세스의 집단(group)과 세션(session)
우주를 예로 들어보면 행성 하나하나를 프로세스라고 생각할수 있을것이다, 그런데 보통 행성은 하나의 항성계에 포함되게 된다. 태양계와 같은 것이 일반적인 경우가 될것이며, 이러한 항성계는 다시 은하계라는 더욱 큰 규모의 천체에 속하게 된다.
프로세스도 마찬가지이다. 각각의 프로세스는 어떠한 집단에 포함될수 있으며, 각각의 집단은 더욱큰 집단에 포함될수 있는데, 이러한 각각의 집단을 우리는 Group 라고 부르며, 여러개의 Gruop을 포함하는 더큰 그룹을 세션이라고 부른다.
보통 그룹은 어떠한 작업을 하기 위해서 공통의 목적으로 생성된 프로세스들의 집단을 말하는데, 가장 일반적인 예가 fork 로 생성된 자식 부모간의 프로세스 그룹이 될것이다.
[yundream@localhost yundream]$ ps -efjc | grep httpd
 UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD
 root 29635 1 29635 29635 - 30 Mar20 ? 00:00:00 httpd
nobody 29636 29635 29635 29635 - 30 Mar20 ? 00:00:09 httpd
nobody 29637 29635 29635 29635 - 30 Mar20 ? 00:00:07 httpd
nobody 29638 29635 29635 29635 - 30 Mar20 ? 00:00:07 httpd
nobody 29639 29635 29635 29635 - 30 Mar20 ? 00:00:07 httpd 
위는 fork 를 사용하는 대표적인 서버프로그램인 httpd의 ps 결과 이다. 보면 알겠지만 29635 프로세스가 최초에 생성되고, 나머지 프로세스들이 29635 를 부모로 가지는 자식프로세스로 생성되었음을 알수 있다(PPID를 확인인하라).
그리고 이들은 동일한 그룹(PGID를 확인하라)으로 묶여 있음을 알수 있다.
이들프로세스가 바로 하나의 프로세스 그룹이 되는것이다.
모든 그룹에는 지도자가 있다(태양계의 지도자가 태양? 이듯이). 프로세스 집단도 마찬가지로 지도자(집단을 최초 생성한)가 있기 마련이다. PID와 PGID 가 같은 프로세스가 그 프로세스 집단의 지도자이며, 위에서 29635 번 프로세스가 PGID 29635 집단의 지도자 프로세스임을 알수 있다. 같은 프로세스 집단에 속하는 프로세스들은 pipe 등을 통하여서 서로간에 통신이 가능하며, signal 등을 처리함에 있어서 그룹내의 프로세스는 동일한 액션을 취한다.
예를 들어서 29635 프로세스를 죽이면, 해당 그룹에 포함되어 있는 모든 자식프로세스도 그에 대한 영향을 받는다.
[yundream@localhost yundream]$ kill -9 29635 
[yundream@localhost yundream]$ ps -efjc | grep httpd
UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD
nobody 29636 1 29635 29635 - 30 Mar20 ? 00:00:09 httpd
nobody 29637 1 29635 29635 - 30 Mar20 ? 00:00:07 httpd
nobody 29638 1 29635 29635 - 30 Mar20 ? 00:00:07 httpd
nobody 29639 1 29635 29635 - 30 Mar20 ? 00:00:07 httpd 

세션은 그룹을 포함하는 그룹이라고 생각하면 된다. 하나의 세션은 여러개의 그룹을 가질수 있으며, 보통 login 시 생성된다. 다른경우로 데몬과 같이 자기 자신이 세션을 가져야하는 경우가 있는데 그러한 경우에 세션이 생성되기도 한다.
[yundream@localhost yundream]$ ps -efjc | grep 945 | grep -v grep
 UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD
root 945 1 945 945 - 30 Mar13 tty3 00:00:00 login -- root
root 21604 945 21604 945 - 30 11:47 tty3 00:00:00 -bash
root 23964 21604 23964 945 - 30 13:27 tty3 00:00:00 ./fork
root 23965 23964 23964 945 - 30 13:27 tty3 00:00:00 ./fork 
위의 ps 화면은 root 유저로 새로 로그인 해서 ./fork 를 실행시킨 과정 을 통해서 세션이 어떻게 생성되는지를 보여주고 있다. ./fork 프로그램은 fork 를 통해서 부모자식 프로세스를 생성한것이며, 이들은 PGID-23964 의 그룹식별자를 가지는 같은 그룹으로 묶이게 된다. 또한 이 그룹은 세션아이디 945 를 가지는 세션에 묶이게 된다.
결론적으로 945 세션은 945, 21604, 23946 세개의 그룹을 가지게 된다. 세션역시 그룹과 마찬가지로 세션지도자를 가지며, 세션지도자는 그 세션을 최후에 만든 프로세스로 PID 와 SID가 같게 된다(자신의 PID번호로 SID를 만든다).
만약에 세션지도자 프로세스를 kill 시키면 어떻게 될까 ?
[root@localhost root]$ ps -efjc | grep 945 | grep -v grep 
세션 프로세스가 사라지자 그와 관련된 모든 프로세스가 kill 되었음을 알수 있다. 

'OS > LINUX' 카테고리의 다른 글

/dev/zero와 /dev/null  (0) 2011.06.04
Perl 입문  (0) 2011.05.17
쉘 스크립트 #6  (0) 2011.05.14
쉘스크립트 ex5  (0) 2011.05.14
쉘스크립트 Ex4  (0) 2011.05.14

egrep

■ egrep 메타문자 요약

 

한 개의 문자에 매치시키기 위한 아이템

.

임의의 한 문자에 매치됨

ex) egrep?'2005.01.05'?file

2005, 임의의 한 글자, 01, 임의의 한 글자, 05에 매치

<2005/01/05, 2005-01-05, 2005.01.05>

[...]

문자클래스

열거된 임의의 문자에 대응됨

ex) egrep?'gr[ea]y'?file

g, r, e(or)a, y에 매치 <grey, gray>

[^...]

부정형 문자클래스

열거되지 않은 임의의 문자에 매치

ex) egrep?'pu[^t]'?file

p, u 뒤에 t가 오지 않는 행만 매치

\char

이스케이프 처리된 문자

char이 메타문제이거나 이스케이프 처리된 내용에 별도의 특별한 의미가 없다면 char문자에 매치 또는 새로운 메타문자를 정의함

ex) egrep?'\$[0-9]+'?file

행의 마지막을 의미하는 $의 의미를 그냥 돈의 단위인 $로 매치시킴 <$40>

 

뒤에 붙어서 '숫자를 세는' 역할을 하는 아이템

?

물음표

한번 나올 수 있지만 없어도 됨

ex) egrep?'html?'?file

h, t, m 뒤에 l이 나올 수도 있고 나오지 않아도 되는 행에 매치 <html, htm>

*

별표

반복회수에 제한이 없으며 아예 없어도 됨

ex)

egrep?-i?'<hr(?+size?*=?*[0-9]+)??*>?file

?이 한번이 나와도 되고 아니면 나오지 않아도 됨 즉 <hr size = 14 > (or) <hr size=14> 등의 스크립트에 매치

+

플러스

적어도 하나 있어야 되며 숫자에 제한이 없음

ex) 

egrep?-i?'<hr(?+size?*=?*[0-9]+)??*>?file

?이 한번 이상 나오는 경우에 적용됨 즉 htm 스크립트에서는 절대로 hrsize라고 붙여쓰지 않음을 말함 또, [0-9]는 숫자 하나에 대응하지만 숫자가 하나이상 나올 수 있음을 의미

min,max

주어진 범위

최소값과 최대값 사이에서 회수가 제한됨

 

위치에 매치되는 아이템

^

캐럿

행 시작되는 위치에 매치됨

ex) egrep?'^cat'?file

c, a, t으로 시작하는 행만 매치

$

달러

행 끝나는 위치에 매치됨

ex) egrep?'cat$'?file

c, a, t으로 끝나는 행만 매치

\<

단어 앞경계

단어의 시작 위치에 매치됨

ex) egrep?'\<cat'?file

c, a, t으로 시작하는 단어만 매치

\>

단어 뒤경계

단어의 끝 위치에 매치됨

ex) egrep?'cat\>'?file

c, a, t으로 끝나는 단어만 매치

 

기타

|

선택(or)

"|"로 분리되는 표현식 중 하나에 매치됨

ex) egrep?-i?'^(from|to)'?file

f, r, o, m이나 t, o로 시작하는 행에 매치

(...)

괄호

① 선택의 범위를 제한하거나 ② 수량자가 적용되는 그룹을 지정하거나 ③ 백레퍼런스를 쓸 때 위치를 지정하기 위한 메타 문자

ex) egrep?-i?'^(from|to)'?file

^의 선택범위를 제한하기 위해서 사용됨

\1, \2

백레퍼런스

앞에서 첫 번째, 두 번째,... 등의 괄호 안에서 매치된 텍스트에 매치됨

ex) egrep?-i?'\<([a-z]+)?+\1\>'?file

\1은 ([a-z]+)에 매치 <옆의 예는 중복단어 체크 매치시키는 표현식>



■ 앞의 표를 이해하는데 유의사항

 

  1. 이탤릭체로 적은 것은 egrep의 버전에 따라서 적용을 시킬 수 있는 경우가 있고 없는 경우가 있으니 주의해서 사용하기 바란다.


  2. ?는 공백의 의미를 사용했다. 이해하는데 무리가 없을 것이다.



■ 생각하는 방식을 바꾸자

ex> egrep 'cat' file

cat이라는 말에 매치되는 행을 찾는 것이 아니라 c 다음에 a 다음에 t가 나오는 행과 매치시키는 것이라고 이해하는 것이 정규표현식을 이해하는 첫걸음이다. 그리고 공백문자를 일반적인 a, b라는 문자와 똑같이 취급을 해야 한다. 공백문자는 컴퓨터는 특별한 무언가로 여기지 않는다.



■ 정규표현식은 언어다. 우리가 어떤 언어를 배우던지 자꾸 써보고 연습해 보는 것이 중요하듯이 정규표현식도 마찬가지다. 그래서 다양한 방법으로 표현된 정규표현식을 익히는 것이 중요하다.



■ grep에서 매칭을 진행하기 전에 일반적으로 \n인 줄바꿈 문자를 잘라내고 진행한다. 그래서 vi 편집기에서 찾을 수 있는 \n은 grep 에서는 찾을 수 없다.



■ 어떤 문자가 메타문자인지 아닌지는 정규표현식에서 문자가 있는 위치가 결정한다. 예를 들어서 *는 메타문자이지만 \* 인 경우는 escape된 경우이므로 메타문자가 아니다. 또 ^의 경우는 행의 제일 앞을 뜻하나 [^...] 의 경우에서는 ...에 매치되는 문자를 제외한 모든 문자에 매치시킨다. 한 가지의 예를 더 들어보자. -의 경우는 [a-z] 안에 있을 경우는 범위를 나타내지만 []밖에 있을 때는 그냥 -문자에 대치된다.




■ 지나치게 자세하게 찾으려는 표현식은 실용성을 떨어뜨린다.

  우리가 보통 날짜를 나타날 때 2005/01/05 또는 2005.01.05 또는 2005-01-05으로 나타내는데 그래서 우리는 위의 세 가지의 경우를 매치시키기 위해서 다음과 같은 정규표현식을 사용할 것이다.  ex> egrep '2005[./-]01[./-]05' file  그렇게 한다면 우리는 정확히 위의 세 가지 표현에 정확히 매치시킬 수 있지만 다소 타이핑의 수가 많아지게 된다. 그래서 우리는 다음과 같은 차선책을 택할 수 있다. ex> egrep '2005.01.05' file  경제적으로 찾을 수 있다. 하지만 이 표현식의 경우는 다음과 같은 위험이 따른다. 만약 2005901?05345 라는 일정한 배열의 숫자가 있다면 이 행도 찾는 결과를 가져온다. 따라서 우리는 경우에 따라서 정확성과 경제성 사이에서 적절하게 선택을 할 필요가 있다.



■ 위의 표현식이 모든 프로그램이나 편집기에 적용된다는 생각은 하지 말도록 부탁한다. 다른 프로그램에서는 좀 더 복잡한 형태로 정의된다. 다른 프로그램에서 정규표현식을 사용할 경우는 반드시 실험적으로 사용하고 난 뒤에 사용하거나 reference를 참고해서 사용해야 한다.



■ 문자클래스[]는 정규표현식 언어와 전혀 상관없이 별도의 메타문자를 사용



■ 이스케이프 처리되는 경우는 다음의 세 가지의 경우로 나눌 수 있다.


  1.  뒤에 메타문자를 사용하면 그 문자 자체가 가지는 형태로 매치된다. 예를 들어서 \* 라고 쓰면 스크립트 상에 있는  * 에 매치된다.


  2.  뒤에 메타문자가 아닌 문자를 쓰면 언어(language)에 따라서 다른 의미를 가지는 메타문자가 된다. 예를 들어 \< 이면 단어의 시작을 의미하는 메타문자가 된다.


  3.  뒤에 일반적인 문자가 오면  의 의미는 없는 것으로 치부해도 된다. 하지만 \1 , 의 경우는 백레퍼런스로 사용된다.



awk

■ awk란

  ? awk는 두 가지 측면을 가지고 있다. 하나는 단순한 Text 편집기로서의 측면과 좀 더 복잡한 연산을 수행하는 프로그램의 측면으로 나눌 수 있다. awk 하나만 잘 해도 웬만한 정도의 C program을 대신할 수 있을 정도의 힘을 가질 수 있다. (C program과 문법이 비슷하다.) 본론으로 들어가기 앞서는 왜 awk가 의미하는 것이 무언인지 알아야 하지 않을까. awk 는 Aho, Weinberger, and Kernighan 이 세 분의 initial을 따서 이름한 것이다. 그럼 본론으로 들어가서......



■ awk 둘러보기

  ? 다음은 예제 파일들이다.

    (파일명 : exe4.txt)

    

  gold     1    1986  USA                 American Eagle

  gold     1    1908  Austria-Hungary     Franz Josef 100 Korona

  silver  10    1981  USA                 ingot

  gold     1    1984  Switzerland         ingot

  gold     1    1979  RSA                 Krugerrand

  gold     0.5  1981  RSA                 Krugerrand

  gold     0.1  1986  PRC                 Panda

  silver   1    1986  USA                 Liberty dollar

  gold     0.25 1986  USA                 Liberty 5-dollar piece

  silver   0.5  1986  USA                 Liberty 50-cent piece

  silver   1    1987  USA                 Constitution dollar

  gold     0.25 1987  USA                 Constitution 5-dollar piece

    (파일명 : exe5.txt)

    

12;466;125;567;0.435

35;366;454;422;0.4565

35;36;45;42;0.45

34;45;235;236;0.454

567;55;233;446;0.56

34;0.53

    ex1) awk '/gold/' exe4.txt

      gold라는 문자를 가진 행을 출력한다.

    ex2) awk '/gold/ {print $5,$6,$7,$8}' exe4.txt

      gold라는 문자를 가진 행중에서 5, 6, 7, 8 열 만 출력해 준다.




    ex3) awk '{if ($3 < 1980) print $3, "    ",$5,$6,$7,$8}' exe4.txt

      3번째 열이 1980보다 작은 행중에서 3, 5, 6, 7, 8열만 출력해 준다. (간격을 ??     ?? 벌려서 만큼 출력한다.

    ex4) awk '/gold/ {ounce+=$2 END print "sum = "ounce}' exe4.txt

      gold라는 문자를 가진 행에서 두 번째 열을 더한 값을 ounce에 저장해서 그 값을 sum = 과 함께 화면에 출력을 해 준다.



■ awk 문법


  1. TEXT 편집문으로서의 awk문법

     

문법 : awk [-F<ch>] (pgm] | -f <pgm_file> [<vars>] [- | <data_file>]

ch : field separator character (필드 구분 문자)

pgm : awk command-line program (awk 명령문)

pdm_file : file containing an awk program (awk program이 있는 파일)

vars : awk variable initialization (awk 변수 초기화)

data file : input data file (입력하는 파일)


  2. PROGRAM으로서의 awk 문법

     

#!/bin/awk

BEGIN

<search pattern 1>

<search pattern 2>

<awk program syntax>

END




■ 검색 패턴 (search pattern)

  

/The/

The를 포함하는 행을 찾아준다.

/^The/

첫 글자가 T로 시작하는 것 중에서 다음 문자가 he가 나오는 행을 찾아준다

/The$/

T h e로 끝나는 문자가 있는 행을 찾아준다.

/$/

$가 있는 모든 행을 찾아준다

/[Tt]he/

The 나 the가 있는 행을 모두 찾아준다.

/[a-z]/

a부터 z까지 한 문자가 있는 행을 찾아준다

/[a-zA-Z0-9]/

다 알죠??

/wh./

wh와 그 다음의 임의의 한 문자와 대응한다.(why, who wh2 등등)

/^[+-]?[0-9]+$/

+or -를 가지고 있거나 없는 거나(++ -- +-는 매치되지 않음) 그 다음은 숫자가 하나이상 나오는 것인데 단어가 숫자로 끝나는 것에 매치한다.

/(^Korea)|(^China)

Korea 나 China에 매치된다.



■ 내부변수

  

FILENAME

현재 입력한 파일명

FS

필드 구분자 (초기값 0)

NF

필드의 개수

NR

현재 파일의 행 번호

OFS 

output의 field separator

$0

전체 입력 파일의 필드



■ 유용한 명령들

  ex1) awk -F ";" '{print NR,$1,$2,$3,$4,$5}' exe5.txt

    필드 구분 연산자를 공백에서 ;로 바꾸어 줌으로써 awk를 연산하고 있다.

  ex2) awk '{if (NR >2) print $0}' exe5.txt

    행 수가 3이상인 행만 출력한다.




  ex3) awk '{if (NF >2) print $0}' exe5.txt

    열 수가 3이상인 행만 출력한다.

  ex4) awk '{if (length($0) >10) print FILENAME,$0}' exe5.txt

    행의 단어 수가 11이상인 행만 출력한다.

  ex5) awk '{if (length($0) >10) printf("line %2d is %5.3f %6.2f %5.3f, %5.3f %5.4f ", NR, $1,$2,$3,$4,$5)}' exe5.txt

    printf 문의 형태가 C program과 일치하는 것을 알 수 있다. 우리는 쉽게 파일에 나오는 수들의 자리 수들을 쉽게 조절할 수 있다.

  ex6) awk '{print system(ls),FILENAME,$0}' exe5.txt

    system()은 UNIX 명령문을 처리하게 해 준다. 그리고 그 처리한 결과가 정상적으로 실행이 되었다면 그 결과로써 0을 리턴해 준다. 만약 실패하였다면 다른 값을 줄 것이다.

  ex7) awk '{print toupper($1), $2, $3}' exe4.txt

    toupper()은 괄호 안에 있는 문자를 대문자로 변환을 시켜서 출력을 시켜준다.

  ex8) awk 'print {tolower($1), $2, $3}' exe4.txt

    toupper()은 괄호 안에 있는 문자를 소문자로 변환을 시켜서 출력을 시켜준다.

  ex9) awk -F ";" '{print sqrt($1), $2, $3}' exe5.txt

    $1을 제곱근 해 준 값이 출력된다. sqrt뿐만 아니라 다음의 함수들도 존재한다. 효과적으로 이용하시길... atan2(y,x) : 아크 탄젠트 y/x를 출력, cos(x), sin(x), exp(x), log(x), int(x)

  ex10) awk '/silver/ {++x END print x}' exe4.txt

    silver와 일치하는 패턴의 줄 수를 구해 주는 것이다. 이것과 똑같은 결과를 얻기 위한 명령으로는 grep ??silver?? exe4.txt | wc -l 이 있다.

  ex11) awk '$1~/silver/ {print $0}' exe4.txt

    $1에서 silver에 매치되는 행들만 출력해준다. 이 명령은 좀 더 유연한 명령을 실행시켜 명령의 완성도를 높인다고 볼 수 있다.

  ex12) awk '{gsub("from","to");print}' exe2.txt

    from을 to로 모두 치환해서 화면에 출력해 준다.

  ex13) awk -F";" '{if(($1>30) &&($2>100)) print $0}' exe5.txt

    첫 번째 열이 30보다 크고 그리고 두 번째 열이 100보다 큰 것을 출력해준다.





■ awk 프로그램 예제


  1. 합계 구하기

    #!/bin/awk

    #파일명 : sum.awk

    #첫 번째와 두 번째 열을 읽어 들여서 각각의 산술평균을 구하는 awk 프로그램

    #사용법 : awk -f sum.awk filename

     

 

BEGIN 

x_sum = 0;

y_sum = 0;

print "Xcen_image";

print "Ycen_image";

 

x_sum +=$1;

y_sum +=$2;

n++

x_average = x_sum/n ;

y_average = y_sum/n ;

 

END print "x_sum :" x_sum ;

printf("%d ", x_average);

 

print "y_sum :" y_sum;

print "y_average :" y_average;

 


  2. 중복되는 행 출력하지 않게 하기

    #!/bin/awk

    #파일명 : uniq.awk

    #첫 번째 열이 같은 행은 출력하지 않고 첫 번째 열이 다른 것이 나오는 행을 출력한다.

    #사용법 : awk -f uniq.awk filename

     

BEGIN  FS = " "

 

if (var != $1 && NR != 1)

print line

var = $1

line = $0

 

END print line



  3. 첫 번째 열을 인자로 사용하는 배열을 사용하여 같은 인자를 가지는 배열일 경우에는 그 합을 구해주기

    #!/bin/awk

    #파일명 : array.awk

    #사용법 : awk -f array.awk filename

     

 

BEGIN  FS=";"

OFS=":"

      

    total[$1] += $2;

        if( lastcategory != $1)

    printf("lastcategory != $1 ");

            print $1;

            lastcategory = $1

        printf( "       ");

        print $1,$2;

      

END     printf(" "); print "TOTALS";

        for(category in total)

 

                printf("        ");

                print category, total[category];

 


이의 사항이 있거나 질문이 있으시면 이곳으로 이메일을 보내주세요 Webmaster

Copyright ⓒ 2005 All Rights Reserved by Hahn Yi

[출처] [리눅스 awk] awk|작성자 holyruby

'OS > LINUX' 카테고리의 다른 글

쉘스크립트 Example2  (0) 2011.05.14
쉘스크립트 example  (0) 2011.05.14
YUM 사용법  (0) 2011.05.13
vi 사용하기  (0) 2011.05.03
GNU screen  (0) 2011.04.23

컴파일 오류시 대처하기

1.

configure: error: xml2-config not found. Please check your libxml2 installation.  에러날때
# yum install libxml2-devel

 

2.

configure: error: Please reinstall the BZip2 distribution   에러날때
해결책 :
[root@localhost local]# wget ftp://sources.redhat.com/pub/bzip2/v102/bzip2-1.0.2.tar.gz
Bzip2팩키지는 configure script가 없습니다. option을 한줄로 써서 컴파일 하고 설치합니다.
# cd bzip2-1.0.2
# make PREFIX=/tools install
# make clean
# cd ../php-5.2.11

 

3.

configure: error: libXpm.(a|so) not found   에러날때
# yum install gtk+ gtk+-devel

# yum install libXpm-devel

 

(# yum install xorg-x11-devel)

 

 

4.

configure: error: mcrypt.h not found. Please reinstall libmcrypt.   에러날때
# cd ..
# wget http://ftp.linux.co.kr/pub/etc/libmcrypt-2.5.7.tar.gz
# tar zxvfp libmcrypt-2.5.7.tar.gz
# cd libmcrypt-2.5.7
# ./configure && make && make install
# cd ../php-5.2.11

 

5.

/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [libphp5.la] Error 1   오류가 날때
# cd ..
# wget http://ftp.gnu.org/gnu/libtool/libtool-2.2.6a.tar.gz
# cd libtool-2.2.6
# ./configure
# make
# make install
# cd ../php-5.2.11

 

6.

overflow2 에러 발생시
~/php-5.3.4/ext/gd/gd.c (php를 받아서 압축을 푼 경로)


/*
        if (overflow2(font->nchars, font->h)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
                efree(font);
                php_stream_close(stream);
                RETURN_FALSE;
        }
        if (overflow2(font->nchars * font->h, font->w )) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
                efree(font);
                php_stream_close(stream);
                RETURN_FALSE;
        }
*/ 해당 부분을 주석처리


'Dev > PHP' 카테고리의 다른 글

PHP CLI 예제 -> 명령행 옵션, argc argv 매개 변수 구하기  (0) 2011.05.13
php5.3 에 ioncube 설치하기  (0) 2011.05.13
php 컴파일에러  (0) 2011.05.13
php mssql 연동 (freetds)  (0) 2011.05.13
FreeTDS 설치 (PHP와 MS-SQL 연동)  (0) 2011.05.13



Yum은 지정된 서버주소로부터 업데이트된 패키지들을 검사하여 다운로드하고 설치까지 처리해주는 텍스트 기반의 업데이트 프로그램입니다. 또한 의존성 문제도 같이 검사하여 관련 패키지들을 자동으로 설치해주기 때문에 이전에 다소 불편하던 RPM 기반의 프로그램 설치 및 업데이트를 대폭 개선한 패키지 관리자입니다.


1. 설정 확인

yum 업데이트를 위해서는 업데이트 서버의 URL와 기타 세부적인 설정사항들을 확인해야 합니다. yum 동작에 필요한 설정은 /etc/yum.conf 파일에 기록되어 있으므로, 텍스트 편집기 등을 통해 yum 설정내용을 확인합니다.

[main]
retries = 20
removepackages = 0
tolerant = 1
cachedir = /var/cache/yum/
exactarch = 1
pkgpolicy = newest
distroverpkg = Haansoft-release
debuglevel = 2
logfile = /var/log/yum.log


[base]
name=Haansoft Linux 2006 Workstation - Base
baseurl= http://community.haansoftlinux.com
/pub/haansoftlinux/OS/2006/Workstation/RPMS

[updates-released]
name=Haansoft Linux 2006 Workstation - Update
baseurl= http://community.haansoftlinux.com
/pub/haansoftlinux/UPDATE/2006/Workstation/RPMS


[main] 파트에서 yum 동작을 위한 상세한 설정을 할 수 있으며, [base][update-released] 등과 같은 파트를 통해서 업데이트 서버의 주소를 지정하게 됩니다.

※ 참고
주요 항목에 대한 설명은 아래와 같습니다.

항목 내용
cachedir 업데이트를 위해 다운받은 패키지들을 임시로 저장하는 경로
logfile 업데이트 내역을 기록하는 로그 파일의 위치
name 업데이트 서버들을 구별하는 명칭
baseurl 업데이트 서버의 주소 및 경로를 지정


 


2. 업데이트

위와 같이 설정사항에 이상이 없다면 바로 업데이트 명령을 통해 패키지를 업데이트 할 수 있습니다.

[root@localhost ~] # yum update

위의 명령을 입력하면 설정파일에 있는 경로를 참고하여 업데이트 서버에 접속한 뒤, 현재 시스템의 패키지들과 업데이트 서버의 패키지들을 비교하여 최신의 패키지를 모두 업데이트 하게 됩니다. 위의 명령은 손쉽게 모든 패키지들을 업데이트 할 수 있기에 가장 많이 사용되는 업데이트 방법입니다. 만일 특정한 패키지들만 업데이트 하고자 하는 경우에는 아래와 같이 원하는 패키지를 별도로 지정해 줍니다.

[root@localhost ~] # yum update [package_name1] [package_name2]...

패키지를 업데이트하기 전에 업데이트된 패키지가 있는지를 체크하기 위해서는 아래와 같이 체크 옵션을 사용합니다.

[rootlocalhost ~] # yum check-update

단, check-update의 경우 현재 시스템에 설치된 패키지를 기준으로 업데이트 목록을 출력해주기 때문에 업데이트 서버에는 등록되어 있지만 현재 시스템에 설치되지 않은 패키지 목록은 볼 수 없습니다. 이럴 경우 아래와 같이 list 명령을 사용해서 업데이트 서버에 있는 모든 패키지 목록을 확인할 수 있습니다.

[root@localhost ~] # yum list

반대로 현재 시스템에 설치되어 있는 패키지 목록을 확인하기 위해서는 아래와 같은 명령을 입력합니다.

[root@localhost ~] # yum list installed

※ Tip
list가 많아서 한 번에 지나가버려 확인이 어렵다면 아래와 같은 리다이렉션 명령으로 리스트를 파일로 생성한 뒤, 확인할 수 있습니다.

# yum list > server.lst
# vim server.lst


 


3. 신규설치

yum을 이용하면 기존 설치되어 있는 프로그램의 업데이트 뿐만 아니라 시스템에 아직 설치되어 있지 않은 새로운 패키지들도 검사하여 설치가 가능합니다. 앞서 말한 yum list 명령으로 업데이트 서버에 있는 패키지 리스트를 확인한 다음, 설치를 원하는 새로운 패키지가 있다면 install 명령으로 설치를 진행할 수 있습니다.

[root@localhost ~] # yum install package_name

여러 패키지들을 한 번에 설치하기를 원한다면 해당 패키지를 계속해서 적어 줍니다. (install 옵션에서는 기본적으로 하나 이상의 패키지를 지정해야 합니다.)

[root@localhost ~] # yum install package_name1 [package_name2] ...

 


4. 패키지 삭제

yum을 이용하여 패키지를 업데이트하고 신규 설치하는 것 이외에 패키지를 삭제하는 기능도 수행할 수 있습니다.

[root@localhost ~] # yum remove package_name

여러 패키지들을 삭제하고자 한다면, 신규설치의 경우와 같이 삭제 명령 뒤에 해당 패키지를 계속해서 지정해주면 됩니다.


 


5. 기타 기능

업데이트 서버에 등록되어 있는 패키지에 대한 상세한 정보를 보기 위해서는 아래와 같은 명령을 입력합니다.

[root@localhost ~] # yum info package_name

최근에 업데이트한 패키지에 대한 정보는 아래 명령으로 확인합니다.

[root@localhost ~] # yum info updates

※ 참고
패키지명이 중복되는 경우에서의 yum 사용 방법

i386 아키텍처 기반의 시스템이 아닌, x86_64 / PPC / IA64 등과 같은 아키텍처를 사용하는 시스템에서는 아래의 예와 같이 중복된 이름의 패키지가 존재하기도 합니다.
[예] gtk2-2.4.13-18.1AX.i386.rpm / gtk2-2.4.13-18.1AX.x86_64.rpm

이는 x86_64와 같은 시스템에서 i386 아키텍처 기반으로 동작하는 프로그램을 지원하기 위한 패키지들로서 정상적인 동작을 위해서는 위의 2가지 아키텍처가 모두 설치되는 것이 좋습니다.
yum에서는 패키지명을 기준으로 업데이트를 처리하기에 위와 같이 패키지명이 동일하고 아키텍처만 다른 프로그램의 경우, 간혹 하나만 설치되거나 잘 설치되지 않는 경우가 있습니다. 이런 경우에는 아래와 같이 설치 시 아키텍처까지 명시하는 방법으로 모두 설치가 가능합니다.
# yum install gtk2 (일반적인 방법)
# yum install gtk2.i386 gtk2.x86_64 (아키텍처 구분 설치법)

위와 같이 2개 이상의 아키텍처가 존재하는 시스템으로는 아래와 같은 것들이 있습니다.


x86_64 : i386, x86_64
ppc : ppc, ppc64
ia64 : i386, ia64

출처 : http://sdhwang.egloos.com/1022912

'OS > LINUX' 카테고리의 다른 글

쉘스크립트 example  (0) 2011.05.14
egrep , awk  (0) 2011.05.14
vi 사용하기  (0) 2011.05.03
GNU screen  (0) 2011.04.23
/etc/sysconfig/i18n - 시스템의 한글 깨짐 문제 해결  (0) 2011.04.23

/etc/sysconfig/i18n - 시스템의 한글 깨짐 문제 해결

 

시스템를 사용하다보면 한글을 인식하지 못해 한글 깨짐현상이 발생할 수 있는데, 이는 시스템에서 한글설정이 되어 있지 않기 때문이며 제어판 파일을 간단히 설정함으로써 해결할 수 있다.

 

아래 예를 보면서 설명하겠다.

[root@inter-devel yswon]# ll
total 64
drwxr-xr-x  2 yswon yswon  4096 Sep 17  2008 ftp
drwxr-xr-x  2 yswon yswon  4096 Sep 17  2008 ftp_log
drwxr-xr-x  2 root  root   4096 Oct 12 17:32 script
-rw-r--r--  1 root  root  13346 Feb  6  2009 temp.txt
drwxr-xr-x  3 yswon yswon  4096 Sep 17  2008 www
drwxr-xr-x  2 yswon yswon  4096 Sep 17  2008 www_log
-rw-r--r--  1 root  root      0 Oct 22 14:23 ????????.txt
[root@inter-devel yswon]#

 

위의 예에서 영문 파일명은 잘 보이지만 한글파일명은 ?등과 같은 깨진 상태로 보인다. 이것은 리눅스 제어판(/etc/sysconfig 디렉토리내에서 설정함)에서 한글코드 설정이 되어있지 않기 때문이다.

 

이 문제는 /etc/sysconfig/i18n 파일의 설정 부분을 변경하면 된다.

현재는 아래와 같이 설정되어 있을 것이다.

LANG="en_us.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"
SYSFONT="latarcyrheb-sun16"

즉, 보시는 바와 같이 'en_us.UTF-8"로 되어 있으며 영문자만 인식할 수 있다. 

 

따라서 한글을 인식하려면 아래와 같이 설정값을 변경해야 한다.

LANG="ko_KR.eucKR"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"
SYSFONT="latarcyrheb-sun16"

 

즉, LANG행을 "ko_KR.eucKR"로 설정해야 한다.

그리고, 로그아웃한 다음 다시 로그인하게 되면 한글깨짐 문제를 해결할 수 있다.

 

이제 다시 확인해 보면 한글파일명이 제대로 보인다는 것을 알 수 있다.

[root@inter-devel yswon]# ll

합계 64
drwxr-xr-x  2 yswon yswon  4096  9월 17  2008 ftp
drwxr-xr-x  2 yswon yswon  4096  9월 17  2008 ftp_log
drwxr-xr-x  2 root  root   4096 10월 12 17:32 script
-rw-r--r--  1 root  root  13346  2월  6  2009 temp.txt
drwxr-xr-x  3 yswon yswon  4096  9월 17  2008 www
drwxr-xr-x  2 yswon yswon  4096  9월 17  2008 www_log
-rw-r--r--  1 root  root      0 10월 22 14:23 한글파일.txt
[root@inter-devel yswon]#


'OS > LINUX' 카테고리의 다른 글

YUM 사용법  (0) 2011.05.13
vi 사용하기  (0) 2011.05.03
GNU screen  (0) 2011.04.23
cut  (0) 2011.04.15
xargs  (0) 2011.04.15

+ Recent posts