Print
카테고리: [ Operating System ]
조회수: 7570

[ sort 사용법 ] 

입력을 받아서 아스키(ascii) 순서로 정렬시킨다. 

- 파일 내용을 정렬하여 출력하기 

$ sort /etc/passwd 

- 대문자와 소문자를 가리지 않고 정렬시키기. 

$ ls | sort -f 

- 크기가 작은 파일로부터 크기가 큰 파일로 정렬시키기. 

$ ls -s | sort -n 
$ ls -s | sort -nr (거꾸로) 

- 특정 구분문자로 나누어 첫번째 인자를 기준으로 정렬하기 

$ sort -t: /etc/passwd 

- 특정 구분문자로 나누어 세번째 인자를 기준으로 정렬하기 

$ sort -t: +2n /etc/passwd 

- who에서 나온 결과를 오랫동안 로그인해있는 사람부터 정렬하기 

$ who | sort +3n +4n 

예제) 

# ip.allow 파일을 정렬하고, 임시 .check_ip_allow.config_ip 파일로 저장한다. 
/bin/sort /etc/ip.allow > /tmp/.check_ip_allow.config_ip 
# 현재의 접속자를 조사해서, 정렬하고, 임시 .check_ip_allow.current_ip 파일로 저장 한다. 
/sbin/ipchains -L input -n | /usr/bin/awk '{ if ($1=="ACCEPT" && $2=="all" && $3=="------" && $5=="0.0.0.0/0" && $6=="n/a") print $4 }' | /bin/sort > /tmp/.check_ip_allow.current_ip 

[ sed 사용법 ] 

편집기를 사용하지 않고 명령행으로 편집하고자 할 때 쓰인다. 

-n sed 명령의 결과로 만들어진 행을 별도의 지정이 없으면 표준출력으로 내보내지 않는다. 

예제) 

- /etc/passwd를 읽어서 기본 로긴 쉘을 csh로부터 tcsh로 변경(substitution)시켜 출력한다. 
$ sed 's/\/csh$/\/tcsh/g' /etc/passwd 
- 위의 예를 파일로 저장한다. 
$ mv passwd passwd.old; sed 's/\/csh$/\/tcsh/g' passwd.old > passwd; rm passwd.old 
- foo라는 파일에서 첫번째부터 열번째 행을 모두 삭제해버린 다음에 나머지 행을 출력한다. 
$ sed '1,10d' foo 
- csh을 사용하는 사용자를 찾아서 /tmp/csh_user라는 파일에 적는다. 
$ sed -n '/csh$/w /tmp/csh_user' /etc/passwd 
---------------------------------------------------------------------- 

1. sed란? 

(1) 개념 

sed는 Stream Editor의 약자로서 파일의 수정을 주 목적으로 한다.  이는 파일을 순방향으로 읽는 동안 연산을 수행하며 텍스트 화일에서의 반복 수정에 용이하다. 

(2) 기능 

주어진 텍스트 패턴을 갖는 모든 행을 delete 

특정 행에서 어떤 텍스트 패턴을 다른 패턴으로 바꿈 

하나의 파일을 다른 곳의 파일로 복사 

입력화일의 특정부분을 출력화일로 보냄 

2. sed의 수행방법 

sed는 순환적으로 동작하며, 아래와 같은 순서로 실행된다. 

(1) 실행순서 

① 입력행을 읽어 패턴 공백으로 옮긴다. 

<패턴 공백? ed와 같이 sed도 편집할 텍스트를 편집버퍼에 저정하는데, 이 버퍼를 패턴 공백이라고 한다. 

② 편집대본(수정할 내용들)을 실행 

③ 패턴 공백을 출력값으로 복사 

(2) sed 구조 

1) sed의 명령행 옵션 

2) sed 명령 

3. sed의 기본예제 

<기본 예제> 

% cat remind 
Janet today at 4. 
Call DEC 
add serial line for Brad 
Home at five sharp 

예제 1) 대치(s)명령, 삽입(i)명령, 삭제(d)명령 사용 예제 

<편집대본(파일명) : script> 

% cat script 

s/DEC/Dept. Environ. Cons./ 

s/today/tomorrow/ 

1i\ 

Werner and Raquel this weekend\ 

Feed polly for adam 

4d 

<결과> 

% sed -f script remind 

Werner and Raquel this weekend 

Feed polly for adam 

Janet tomorrow at 4. 

Call Dept. Environ. Cons. 

add serial line for Brad 

예제 2) 변경(c) 명령 사용 예제 

% cat script1 

2c\ 

Dept. Environ. Cons 

<결과> 

% sed -f script1 remind 

Janet today at 4. 

Dept. Environ. Cons 

add serial line for Brad 

Home at five sharp 

예제 3) write명령을 사용한 예제 

% cat script2 

1,2w firstfile 

s/DEC/Dept. Environ. Cons./w rewrite 

4d 

w delfile 

<결 과> 

% sed -f script2 remind 

Janet today at 4. 

Call Dept. Environ. Cons. 

add serial line for Brad 

% cat rewrite 

Call Dept. Environ. Cons. 

% cat firstfile 

Janet today at 4. 

Call DEC 

% cat delfile 

Janet today at 4. 

Call Dept. Environ. Cons. 

add serial line for Brad 

예제 4) g옵션의 사용 

<기본예제> 

% cat file1 

It follows, then, that the divine, being good, 

is not, as most people say 

for the food things in human lige are far fewer than 

the evil, and, whereas the good must be ascribed to heaven only, 

<s옵션을 이용하여 문자열 바꾸기> 

% sed -e s/the// -e /for/d file1 

It follows, n, that the divine, being good, 

is not, as most people say 

evil, and, whereas the good must be ascribed to heaven only, 

<g옵션을 이용하여 문자열 바꾸기> 

% sed -e s/the//g -e/for/d file1 

It follows, n, that divine, being good, 

is not, as most people say 

evil, and, whereas good must be ascribed to heaven only, 


[ awk 사용법 ] 

- 화면출력 '{ print }' 

- 입력된 행을 자동으로 공백을 기준하여 필드 단위로 나눈다. 앞 필드부터 $1 $2 $3 ... 

예) route | grep UH | grep eth1 | awk '{ print $1 }' | grep -v "255.255.255.255" 

결과) IP만 뽑아 온다. 

192.168.1.33 

192.168.1.132 

192.168.1.3 

- -F: 구분문자(:)를 지정하여 나눌 수 있다. 

예) head /etc/passwd | awk -F: '{ print $1, $7 }' 

결과) :를 구분문자로 나누어 첫번째, 일곱번째 인자를 뽑아온다. 

root /bin/csh 

nobody 

daemon 

각종 예제 - 

# DHCP 동적IP할당된 IP를 얻어오기 

$ /sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://' 

결과: 210.219.177.223 

# 임시 .check_ip_allow.diff 파일에서 다른 부분(허가 되지 않은 인터넷 접속자)은 인터넷을 차단한다. 

l=`/bin/grep "<" /tmp/.check_ip_allow.diff | /usr/bin/awk '{ print $2 }'` 

for a in $l; do 

ipchains -D input -s $a -j ACCEPT 

done 

# 임시 .check_ip_allow.diff 파일에서 같은 부분(허가 되지 않은 인터넷 접속자)은 인터넷을 허가 한다. - 반복됨이 문제 

l=`/bin/grep ">" /tmp/.check_ip_allow.diff | /usr/bin/awk '{ print $2 }'` 

for a in $l; do 

ipchains -I input -s $a -j ACCEPT 

done 

---------------------------------------------------------------------- 

awk 한 라인으로 할수 있는 여러가지 일들! 

1. 텍스트 파일의 전체 라인수를 계산 

END { print NR } 

2. 텍스트 파일의 특정번째 라인의 문자열을 프린트 

NR == 10 

3. 각 라인의 맨끝 단어를 프린트 

{ print $NF } 

4. 마지막 입력 라인의 마지막 필드를 프린트 

{ field = $NF } 

END { print field } 

5. 4개 이상의 필드(단어)를 가지고 있는 라인을 프린트 

NF > 4 

6. 마지막 필드의 값이 4 이상인 라인을 프린트 

$NF > 4 

7. 모든 입력 라인에서의 총 필드의 갯수를 구함 

{ nf = nf + NF } 

END { print nf } 

8. 'fly'를 포함하고 있는 라인의 총수 계산 

/fly/ { nlines = nlines + 1 } 

END { print nlines } 

9. 가장 긴 첫번째 필드(단어)와 그 해당 라인을 출력 

$1 > max { max = $1; maxline = $0 } 

END { print max, maxline } 

10. 적어도 한 필드(단어)를 포함하고 있는 모든 라인을 프린트 

NF > 0 

11. 80문자 이상을 가진 모든 라인을 프린트 

length($0) > 80 

12. 필드의 갯수와 해당 라인을 프린트 

{ print NF, $0 } 

13. 첫번째 두 필드를 반대로 프린트 

{ print $2, $1 } 

14. 첫번째 두 필드를 반대로 바꾼 다음, 그 라인을 프린트 

{ temp = $1; $1 = $2; $2 = temp; print } 

15. 첫번째 필드는 라인 번호로 대체하여 그 라인을 프린트 

{ $1 = NR; print } 

16. 두번째 필드는 삭제한 후 라인을 프린트 

{ $2=""; print } 

17. 각 라인의 모든 필드를 역순으로 프린트 

{ for (i=NF; i> 0; i = i-1) printf("%s ", $i) 

printf("\n") 

18. 각각의 라인에 대하여 각 필드를 더한 값을 프린트 

{ sum=0 

for (i=1;i<=NF;i=i+1) sum=sum+$i 

print sum 

19. 모든 라인에 존재하는 필드를 모두 더한 값을 프린트 

{ for (i=1;i<=NF;i=i+1) sum=sum+$i } 

END { print sum } 

20. 모든 라인에 대하여 각 필드의 절대값을 그 필드로 교체하여 그 라인을 프린트 

{ for (i=1;i<=NF;i=i+1) if($i < 0) $i=-$i 

print 

AWK의 system variable 

awk FILENAME 현재파일명 

AWK 명령들 

수치연산 

atan2 atan2(y,x) 

cos cos(x) 

exp exp(arg) 

int int(arg) 

log log(arg) 

rand rand() 

sin sin(x) 

sqrt sqrt(arg) 

srand srand(expr) 

문자열연산 

gsub gsub(r,s[,t]) 

index index(str,substr) 

length length(arg) 

match match(s,r) 

split split(string,array[,sep]) 

sub sub(r,s[,t]) 

substr substr(string,m[,n]) 

tolower tolower(str) 

toupper toupper(str) 

제어문 

break 

continue 

do/while 

exit 

for 

if 

return 

while 

입출력/프로세스 

close close(filename-expr) 

delete delete array[element] 

getline getline [var][<file] 

next next 

print print [args][destination] 

printf printf format [, expression(s)][destination] 

sprintf sprintf (format [,expression(s)]) 

system system(command) 

--------------------------------------------------------------------

[AWK] 

1. awk의 기본 개념 

1) awk란? 

; awk란 이름은 이 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의 머리글자를 따온 것 

① awk는 일종의 프로그래밍 언어지만 일반적인 언어라기 보다는 주로 패턴의 검색과 조작을 주목적으로 만들어진 것이다. 

② 파일의 각 라인에서 필드(field)를 인식할 수 있는 패턴 매칭 기능을 가지고 이들 필드를 자유자재로 조작 가능한 유틸리티를 작성하고자 만든 것이다. 

2) awk의 응용분야 

데이터 프로세싱, 리포트 작성, 간단한 데이터베이스 구축, 등 

3) awk를 이용한 작업 

① 프로그래머가 자신이 작성한 프로그램의 입력 화일이 특정한 형식에 들어 맞게 이루어져 있는지 검사. 

② 출력화일을 처리하여 리포트를 만들어 냄. 

③ 다른 프로그램의 입력 형식에 맞게 변환하는 작업에 이용. 

2. awk 프로그램의 구조 및 실행 

(1) awk 프로그램의 구조 

1) awk ' pattern {action} 

pattern {action} 

' filenames <-----------------입력화일(예제 : students) 

2) awk -f parttern-action-file filenames <----- 입력화일 

awk실행 action을 가진 프로그램 file 

(2) awk의 pattern 

패 턴 내 용 

BEGIN 입력화일을 읽어들이기 전에 옆에 제시되는 문자을 실행시키도록 한다. 

END awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다. 

expression 식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null인 경우 문장을 실행한다. 

/re/ 정규식과 일치하는 문자열을 포함하고 있는 라인에서 문장을 실행한다. 

compound-pattern 복합패턴이라는 것으로 &&(and), ||(or) , !(not) 그리고 괄호에 의해 연결시킨 것이다. expression의 경우와 마찬가지로 복합 패턴도 참인 경우의 문장을 실행시킨다. 

pattern1, pattern2 이러한 패턴을 범위 패턴이라한다. 현재 처리되고 있는 라인이 pattern1과 일치되고, 다음에 따라오 는 라인 중 임의의 라인이 pattern2와 일치할 때, 범위 패턴은 두 라인 사이의 각 라인과 일치한다. 

(3) awk의 연산자 

연 산 자 내용 

= += -= *= /= %= 배정(assignment)연산자 

+ - * / % ++ -- 산술 연산자 

|| && ! 논리 연산자(|| = OR, && = AND, ! = NOT) 

> >= < <= == != 비교 연산자 

v ~p 변수 V가 패턴 P에 부합되면 참 

v !~p 변수 V가 패턴 P에 부합되지 않으면 참 

(4) 액션(Actions) 

액션은 문장(statements)으로 이루어져 있다. 액션은 간단하게 상수 하나로 이루어질 수도 있고, 개행 문자나 세미콜론(;)에 의해 분리된 몇 개의 문장의 연속으로 구성될 수도 있다. 

① expressions 

② print expression-list 

③ printf(format, expression-list) 

④ if (expression) statement 

⑤ if (expression) statement else statement 

⑥ while (expression) statement 

⑦ for (expression; expression; expression) statement 

⑧ for (variable in array) statement 

⑨ do statement while (expression) 

⑩ break 

⑪ continue 

⑫ next 

⑬ exit 

⑭ exit expression 

⑮ {statement} 

(5) awk에서 미리 정의된 몇가지 변수들 변 수 내 용 

FILENAME 현재 처리되고 있는 입력 파일의 이름 

FS 입력 필드 분리문자 

NR 현재 레코드(행)의 번호 

NF 현재 레코드(행)의 필드의 갯수 

OFS 출력되는 필드의 분리문자 

3. awk의 기본예제 

(1) 예제 입력 파일 소개 

① 입력화일의 이름은 students 

② 이 파일의 각 라인은 3개의 필드로 구성(학생 성명, 학과명, 나이) 

③ 각 필드는 공백에 의해서 분리(공백을 필드 분리자로 간주함.) 

< awk는 각 라인에서 필드를 추출해 내는 데 필드 분리자(field separator)를 사용, 필드 분리자는 보통 하나 이상의 공백 문자이다.> 

1) 입력화일 예제 students 

% cat students 

John,P Physics 20 

Rick,L Mechanical 21 

Jack,T electrical 23 

Larry,M Chemical 22 

Phil,R Electrical 21 

Mike,T mechanical 22 

Paul,R Chemical 23 

John,T Chemical 23 

Tony,N Chemical 22 

James,R Electrical 21 

예 1) 식(expression)에 맞는 field 프린트하기 

% awk '$3 > 22 {print $1}' students 

Jack,T 

Paul,R 

John,T 

예 2) if 문을 사용하여 조건에 맞는 line 분리하기(각 파일에 저장) 

step 1 : if문을 사용하는 프로그램을 awkprog1이라는 파일로 만든다. 

% cat awkprog1 

{ if ($1 ~ /^J/) printf "%s\n", $0 > "Jfile" 

if ($1 ~ /^P/) printf "%s\n", $0 > "Pfile"} 

step 2 : students 입력화일에 awkpog1 프로그램 화일을 적용한다. 

% awk -f awkprog1 students 

step 3 : 결과 보기 

% cat Jfile 

John,P Physics 20 

Jack,T electrical 23 

John,T Chemical 23 

James,R Electrical 21 

% cat Pfile 

Phil,R Electrical 21 

Paul,R Chemical 23 

 

예 3) 평균값 구하기 

<프로그램 awkprog2, awkprog3> 

% cat awkprog2 

{sum += $3} 

END {printf "The average of the ages is %.2f\n", sum/NR} 

% cat awkprog3 

{sum += $3 

++no} 

END {printf "The average of the ages is %.2f\n", sum/no} 

<결 과> 

% awk -f awkprog3 students 

The average of the ages is 21.80 

예 4) while 과 do문을 이용하여 평균값 구하기 

<프로그램 awkprog4> 

% cat awkprog4 

{if (NF > 0) { 

sum = 0 

n = 1 

while (n <= NF) { 

sum = sum + $n 

n = n+1 

printf "Average is %d\n", sum/NF 

else 

print} 

<예 제> 

% awk -f awkprog4 test 

Average is 17 

Average is 3 

Average is 25 

Average is 0 


[ grep 사용법 ] 

- 일치하는 단어가 있는 행만 뽑아온다. 

예) ls -p | grep / 

- -v 일치하지 않는 행만 뽑아오기. 

예) ps -axu | grep -v root 

- 처음에 특정 단어가 있는 행만 뽑아오기. 

예) grep '^From:' ~/mbox 

- 끝에 특정 단어가 있는 행만 뽑아오기. 

예) cat /etc/passwd | grep 'csh$' 

- 일치하는 단어가 있는 행이 몇줄 있는지 세오기 

예) ls -p | grep -c /