정규식 이해
$ cat sampfile
This is sample data file
Hello This is Kim.
I'm so happy
Test100
test200
Are you unhappy ?
Hello This is Kim.
I'm so happy
This is sample data file
Hello This is Kim.
I'm so happy
Test100
test200
Are you unhappy ?
$ egrep "ee*" samplefile
This is sample data file
Hello This is Kim.
Test100
test200
Are you unhappy ?
$ egrep "ppp*" sampfile
I'm so happy
Are you unhappy ?
This is sample data file
I'm so happy
Are you unhappy ?
I'm so happy
Are you unhappy ?
Are you unhappy ?
$ egrep "happy" samplfile
I'm so happy
Are you unhappy ?
$ egrep "<happy>" sampfile
I'm so happy
$ egrep "happy>" sampfile
I'm so happy
Are you unhappy ?
$ egrep "^[A-Z]" sampfile
test200
$ egrep "^[^A-Z]" sampfile
This is sample data file
Hello This is Kim.
I'm so happy
Test100
Are you unhappy ?
$ egrep "[0-9]$" sampfile
Test100
test200
{최소값,최대값}: 최소값부터 최대값까지 횟수 만큼 반복
ex) a{1} a가 정확히 한번 team , happy, goal
a{1,} a가 한번이상 반복 team. aang, aaaang
a{2,5} a가 2번이상 5번 이하 반복 aa, aaa, aaaa, aaaaa
" 숫자 " : 숫자번째 내부 표현식에 부합된 문자열을 다시 참조한다.
$ egrep '([A-Za-z0-9].*)(:.*){4}:/export/home/1:' /etc/passwd
결과> /etc/passwd 파일안에서 사용자의 login명과 기본 디렉토리명이 같은 사용자를 검색하여 출력한다.
Hello This is Kim.
Pattern Statment Section : 파일의 각 레코드 라인을 읽어들일 때 마다 실행
END Section : 파일을 다 읽어들인 뒤 실행
/pattern expression / { statements .... }
END { statements… }
$ awk '{print $0 }' datafile ....
단일인용문( ' ' ) 안에 프로그램을 기술한다. 데이터 파일을 정의하지 않으면 표준 입력으로부터 데이터를 입력 받는다.
$ awk -f awk-program-filename data-filenames
$ awk ' BEGIN { print "awk 프로그램 실행 연습입니다" } '
$
$ awk '{ print $1, $2 } ' data1
100 200
300 400
500 600
$
$ cat ex01
# This is sample file
BEGIN {
print "Hello, I'm Kim "
exit }
$
$ awk -f ex01
Hello, I'm Kim
$0 : 현재 입력된 레코드를 나타내는 변수
$1 : 현재 입력된 레코드의 첫 번째 필드를 나타내는 변수
$n : 현재 입력된 레코드의 n번째 필드를 나타내는 변수
NR : 레코드 수
NF : 필드 수
FS : 필드 구분 문자
RR : 레코드 구분 문자
OFS : 출력 필드 구분 문자
ORS : 출력 레코드 구분 문자
FILENAME : 현재 입력된 파일 이름
OFMT : 출력 인쇄 형식
$ cat data1
100 200
300 400
500 600
$ cat ex02
BEGIN { OFS="------" }
{ print $1,$2 }
$
$ awk -f ex02 data1
100------200
300------400
500------600
$
$ cat ex03
{ x = $1 + $2
y = y + x }
END { print y }
$
$ awk -f ex03 data1
1600
$
"/ /,/ /" 형식을 사용하여 패턴으로 범위를 지정할 수 있다.
$2 ~ /^[0-9]+$/ { print $2 }
-> 두 번째 필드가 숫자로만 구성되어 있으면 두 번째 필드값을 출력
$ awk -f ex04 data1
200
400
600
$
$ cat ex05
$0 ~ /[Ee]nd/ { print "end of", FILENAME }
$
-> 읽어 들인 레코드의 값이 End 또는 end이면 "end of data1" 과 같은 형식으로 출력
$ cat ex05_1
/Begin/,/End/ { total += $1 }
END { print "Total = " total }
관계연산자는 숫자 또는 스트링 값을 비교할 때 사용한다.
!= 같지 않다
> 크다
< 작다
>= 크거나 같다
<= 작거나 같다
$1 >= 10000 { print "첫번째 필드값이 10000 보다 크거나 같다" }
$1 >= "s" { print " 첫 번째 필드가 s 보다 뒷문자(tuvw..)이다"}
$1 < $2 { print "두번째 필드 값이 첫 번째 필드 값보다 크다"}
!~ 패턴과 같지 않다.
$1 !~ /^[0-9]+$/ { print "첫번째 필드가 숫자가 안니다" }
$2 ~ /korea/ { print "두번째 필드값이 korea 이다"}
+ 더하기
- 빼기
* 곱하기
/ 나누기
% 나누어서 남은 나머지
= 지정연산
ex) a = 10
+= , -=, *=, /=, %=
-- 1 감소
$ cat ex06
END { a = 0
print "a++ = ", a++
print "a-- = ", a--
exit
}
BEGIN { a = 0 }
$1 > 100 { a++ }
END { print "첫번째 필드의 값이 100보다 큰 경우는 ", a, "번입니다" }
$
첫번째 필드의 값이 100보다 큰 경우는 2 번입니다
" , " (쉼표)는 "print"문 안에서 필드를 구분한다. "" 사이의 문자열은 하나의 필드로 취급된다.
출력방향을 조정하기위해 " > " 문자와 " >> " 문자를 사용할수 있다. 출력될 파일이름은 인용부호("")안에서 사용한다.
$ cat ex08
{ print $1,$2 > "sample"}
$
$ awk -f ex08 data1
$ cat sample
100 200
300 400
500 600
사용형식은 printf "format",expression1, expression2,..... 이다.
format에서 변환사양은 % 기호를 붙여서 표시한다
%o 8진수
%x 16진수
%s 문자열
%f 소수
%e 지수를 사용한 소수
%g %f,%e중 짧은 형태의 출력을 사용한다.
$ cat ex09
$1 ~ /^[0-9]+$/ { printf "첫번째 필드 값은 %d 입니다n",$1 }
$
$ awk -f ex09 data1
첫번째 필드 값은 100 입니다
첫번째 필드 값은 300 입니다
첫번째 필드 값은 500 입니다
$
END { print " Pipe Test ...Is it OK? " | "mail guest" }
$
$ awk -f ex08 data1
$ login guest
Welcome to guest account
You have mail
{ if ( $1 < 100 && $2 > $3 )
{ print "첫번째 필드값이 100보다 작고 두 번째 필드값이 세 번째 필드값 보다 큽니다" }
}
{ if ( $1 > 100 || $2 >100 )
{ print "첫번째 필드값이 100보다 크거나 두 번째 필드값이 100보다 큽니다" }
}
while ( i <= NF )
{ print "필드수가 1개보다 작거나 같습니다" }
}
$ cat ex10
{ for ( a = 1 ; a <= NF ; a++ ) print NR,a ,$a }
$ awk -f ex10 data1
1 1 100
1 2 200
2 1 300
2 2 400
3 1 500
3 2 600
$
" continue "문은 순환문의 수행을 중지하고, 순환문의 처음 조건을 테스트한다.
" next " 문은 다음 입력 레코드를 읽어 들이고 프로그램 수행은 패턴문의 처음을 수행한다.
" exit " 문은 프로그램 실행을 종료한다
$ cat ex11
{ for ( n = 1; ; n++ )
{ if ( n <= NF ) { print NR, n, $n
continue }
break
} }
$
$ cat ex12
NF > 2 { print NR, NF; next }
$
$ cat ex13
$1 > 100 { print NR, " $2= ", $2, "$2값 오류"
exit 99 }
$
{ print NR, "입력된 문자열의 문자수는 " , length, "개입니다" }
$
{ print NR, "첫번째 필드의 문자수는 ", length($1), "개입니다" }
$
BEGIN {
print substr("Happy Birthday",7,9)
exit }
Birthday
BEGIN {
print index("Hello This is Kim","This")
exit
}
7
$
{ var = sprintf("출력연습 : 첫 번째 필드 : %d ",$1)
print var
}
$
100
300
500
$
-n 결과행의 출력을 하지 않는다
-e 편집할 명령을 기술한다. 각각의 편집 명령마다 이 옵션을 붙인다
-f 편집할 명령을 파일로 작성한 뒤 파일에서 읽어서 명령을 실행한다
input_data_file 입력을 지정하지 않으면 표준입력으로부터 입력을 읽어 들인다.
$ sed -f sed_script_file filenames
$ cat datafile
Hello this is kim.
I'm so happy to meet you.
Test sample
sample program
Java programming
Hello this is kim.
I'm so happy to meet you.
Test sample
$ sed -n '/^s/p' datafile
sample program : 라인의 시작이 's'인 라인을 출력
$ sed '/^s/p' datafile
Hello this is kim.
I'm so happy to meet you.
Test sample
sample program
Java programming
$ cat sam_file
sample program
$ sed '1,3d 'datafile
sample program
Java programming
$ sed '/^sample/,/^Java/d' datafile : 라인중 sample로 시작하는 라인 부터 Java로 시작하는 라인 까지 삭제
Hello this is kim.
I'm so happy to meet you.
Test sample
$ cat file1 : 각 라인의 아래에 '=====' 라인이 추가된다
a
=====
$ sed -f file1 datafile
Hello this is kim.
=====
I'm so happy to meet you.
=====
Test sample
=====
sample program
=====
Java programming
=====
$ cat file2
i
***
$ sed -f sed_script_file filenames
***
Hello this is kim.
***
I'm so happy to meet you.
***
Test sample
***
sample program
***
Java programming
$ sed -n '1,3s/t/T/gp' datafile :변경된 라인만 출력
Hello This is kim.
I'm so happy To meet you.
TesT sample
$ sed '1,3s/t/T/g' datafile :모든라인을 모두 출력
Hello This is kim.
I'm so happy To meet you.
TesT sample sample program
Java programming
$ sed -n '1,3s/t/T/gw sam_file2' datafile : 변경된 라인만 sam_file2 파일에 저장 한다
$ cat sam_file2
Hello this is kim.
I'm so happy To meet you.
TesT sample
$ sed 's//export/home/home3/g']
/export/home is user01's base directory <-- 입력라인
/home3 is user01's base directory <- 출력라인
[출처] 정규식 이해 |작성자 박신양
'프로그래밍 > BASH SHELL' 카테고리의 다른 글
정규표현식 (0) | 2015.01.27 |
---|---|
쉘 문법 (0) | 2015.01.27 |
쉘 명령 기초 (0) | 2015.01.27 |
쉘 프로그래밍 (shell programming) (0) | 2015.01.27 |
쉘 프로그래밍을 연마하자 (3) (0) | 2015.01.27 |