2008. 10. 14.

grep,egrep,sed,awk사용법(정규표현식)

▒ grep : 패턴을 이용한 search => regular expression을 잘 만드는 것이 필요하다.

grep option(s) pattern filename(s)

OS/tdir] grep -n dba /etc/group # -n : 파일 안에서의 패턴이 발견된 라인 및 라인 번호
OS/tdir] grep -v dba /etc/group # -v : 패턴이 발견되지 않은 라인
OS/tdir] grep -n dba /etc/group /etc/passwd # 파일을 여러개 나열...
OS/tdir] grep -i the ~/tdir/* # -i : 대소구분 무시(ignore) => the 대소구분 없이
OS/tdir] grep -li the ~/tdir/* # -l : 패턴이 들어있는 파일 이름만...
OS/tdir] grep -c the ~/tdir/* # -c : 패턴이 들어있는 라인 번호만...

[패턴을 좀더 정교하게 표현하려면 regular expression을 사용해야 한다]

^ : ^패턴 : 패턴으로 시작하는 모든 라인 찾기
$ : 패턴$ : 패턴으로 끝나는 모든 라인 찾기
. : d... : d로 시작하는 4자리 character 찾기
* : [a-d]* : a, b, c, d로 시작하는 character 찾기
[] : [Dd]atabase : Database 또는 database 찾기
[^] : [^D] : D가 나타나지 않는 라인 찾기

OS/tdir] grep -i ^the ~/tdir/* # the로 시작하는 라인 찾기
OS/tdir] grep -i meal.$ ~/tdir/* # meal.으로 끝나는 라인 찾기
OS/tdir] grep c...d ~/tdir/* # c로 시작하고 d로 끝나는 5자리 character 찾기

================================================================

▒ egrep(expression grep) : searches files for a pattern of characters
and prints all lines that contain that pattern.



OS/tdir] egrep '(a|A)d+' /etc/passwd # ad 또는 Ad가 포함된 라인 찾기
OS/tdir] vi grep_test # 아래 내용을 추가하세요... 붙여넣기... ^^

An Oracle database is a collection of data treated as a unit.
The purpose of a database is to store and retrieve related information.
A database server is the key to solving the problems of information management.

OS/tdir] egrep 'Oracle|purpose' grep_test # Oracle 또는 purpose가 포함된 라인 찾기

===============================================================

▒ sed : stream editor => file을 열지 않고 data를 편집하는 기능

sed [-options] [address] command file... [>newfile]



# sed '/pattern/d' filename # file에서 패턴이 포함된 라인을 지우고 그 결과를 화면에 표시
# 원본 파일에는 아무런 변화가 없다.

OS/tdir] cp grep_test sed_test
OS/tdir] cat sed_test
OS/tdir] sed '/purpose/d' sed_test # purpose 라는 단어가 들어간 라인 삭제

# sed '#d' filename : # 라인만 삭제
# sed '$d' filename : 마지막 라인 삭제
# sed '#,$d' filename : # 라인부터 마지막 라인까지 지우기
# sed '#,#d' filename : # 라인부터 # 라인까지 지우기

OS/tdir] sed '1d' sed_test # 1 라인만 삭제
OS/tdir] sed '$d' sed_test # 마지막 라인만 삭제

OS/tdir] sed '/purpose/d' sed_test > set_out # sed 처리 결과를 sed_out 으로 저장
OS/tdir] cat set_out

OS/tdir] sed '/purpose/p' sed_test # 패턴이 포함된 라인이 두번 출력(print)된다.
OS/tdir] sed -n '/purpose/p' sed_test # 패턴이 포함된 라인만 출력된다.

OS/tdir] sed 's/$/ Oracle/' sed_test # 각 라인의 마지막에 원하는 글자 추가

OS/tdir] sed 's/ */#/g' sed_test # space를 찾아서 #기호로 변환한다.
OS/tdir] sed 's/ */-/g' sed_test # space를 찾아서 -기호로 변환한다.
# * 기호 앞에 space가 두개라는 점에 유의

OS/tdir] # 한번에 여러 가지 편집 수행
OS/tdir] sed -e 's/database/DATABASE/g' -e 's/information/INFORMATION/g' sed_test

===============================================================

▒ awk : 패턴 검색과 처리를 위한 언어

=> 명령어의 이름은 개발자인 Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan 3인의
머리글자를 사용해서 만든 것이다.

awk '{ action}' filename

OS/tdir] ls -l | awk '{print $0}' # 전체 필드가 모두 나타나도록...

drwxr-xr-x 2 prof9i4 dba 512 4월 25일 15:44 a_dir
drwxr-xr-x 2 prof9i4 dba 512 4월 18일 23:53 b_dir

$1 $2 $3 $4 $5 $6 $7 $8 $9
$0




OS/tdir] ls -l | awk '{print $1}' # 1번 필드만 나타도록...
OS/tdir] ls -l | awk '{print $1, $9}' # 1번과 9번 필드만 나타나도록...
OS/tdir] ls -l | awk '{print $3 "\t" $4 "\t" $9}' # Tab 키가 적용된 결과...
OS/tdir] ls -lt | awk '{print $9, "is using", $5, "bytes"}' # text 추가
OS/tdir] ls -lt | awk '$5 <= 200 {print $0}' # 5번 필드가 200 이하일 경우 출력

AWK

AWK
awk는 직접 사용자로부터 입력을 받거나 아니면 지정한 파일을 가공하여 표준 출력한다
표준 출력을 리다이렉션할 수 있다
사용법
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
옵션
-Fc : field separator 지정
c는 필드 사이를 구분하는 구분자이다

직접 지정하지 않으면 공백을 기준으로 한다

시스템 변수 FS를 지정하는 것과 같은 효과를 지닌다
-v 변수 = 값
스크립트를 실행하기 전에 미리 변수를 지정하여 준다
-f 스크립트 파일
스크립트를 파일에서 가져온다
-f 옵션을 여러번 사용하여 여러개의 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다
스크립트
패턴 { 동작 }
커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표로 묶는다
패턴만 있는 경우 : 패턴과 일치하는 레코드(라인)를 화면에 출력한다
동작만 있는 경우 : 모든 레코드(라인)가 동작의 대상이 된다
패턴
/정규표현식/
sed가 지원하지 않는 +, ?, |, ( ) 등의 메타문자도 지원한다 또한
^, $를 각 필드의 처음과 끝을 의미하도록 사용할 수도 있다
비교연산
숫자 기준, 알파벳 기준 모두 사용 가능하다
패턴 매칭 연산
~ : 일치하는 부분을 나타낸다
!~ : 일치하지 않는 부분을 나타낸다
BEGIN
첫 번째 레코드가 읽혀지기 전에 어떤 동작을 정의하여 사용하고 싶을 때 사용한다
END
마지막 레코드가 모두 읽혀진 후 어떤 동작을 정의하여 실행하고 싶을 때 사용한다
동작
동작은 모두 { }로 둘러싸야 한다
예제
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
awk 시스템 변수

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

awk 연산자

산술 : =, +=, -=, *=, /=, %= 조건 : ? : 논리 : ||, &&, ! 패턴 : ~, !~
비교 : <, <=, >, >=, !=,== 증감 : ++, -- 필드참조 : $

제어문(C의 제어문과 같다)
break
continue
do {실행} while (조건)
exit
for (관계형 배열의 요소) {실행}
펄의 foreach와 같다
if (조건) {실행} else {실행}
return
while
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)
시스템 내부 명령어를 실행한다
간단한 예
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 '
지정한 파일의 짝수번째의 라인만을 출력해 준다