- Awk?
- 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어
- 사용자가 지정한 패턴 검색이나 특별한 작업을 수행하기 위해 파일을 행 단위로 조사
<Form>
# awk '패턴' [파일명]
# awk '{액션}' [파일명] -->액션으로 보통 print를 사용한다.
# awk '패턴 {액션}' [파일명]
예제1> passfile 의 내용은 아래와 같다. awk를 사용하여 첫 번째 필드를 출력하라.
# awk '{print $1}' passfile -> 동작으로 print를 할것이고 $1은 첫번째 필드를 의미.(필드는 공백으로 구분된다.)
예제 2> passfile에서 Access를 포함하는 행들의 첫 번째와 두 번째 필드를 출력하라.
# awk '/Access/{print $1, $2}' passfile --> / / 사이에 검색할 문자 or 패턴이 들어가며 액션으로 첫 번째 두 번째 필드
출력하도록 하였다.
예제 3> # df명령을 통해 출력되는 내용 중 두번째 필드가 9920624 이상인 행을 출력하라.
# df | awk '$2 >= 9920624' --> df의 프로세스를 awk로 넘겨주고, awk는 두번째 두번째 필드를
9920624와 비교하여 크거나 같은 행을 뽑는다. ( ' ' 안에는 패턴이 들어가게 된다.)
예제 4> # date 실행에 나오는 두 번째 필드와 여섯 번째 필드에 Month : 와 Year : 라는 문자를 추가해 뽑아내라.
# date | awk '{print "Month : "$2, "\nYear : "$6}' --> 액션으로 print를 쓰게되면 " "를 통해 문자로 출력이 가능하다.
때문에 "Mont : "다음에 두번째 필드가 출력된 것.
- awk 명령에 사용되는 NR , NF 변수 와 옵션
* NR 변수 - 하나의 레코드를 처리한 후 1이 증가하는 변수. (즉, 해당 패턴이 몇 번째 행에 있는지 나타내 주는 변수)
* NF 변수 - 필드의 개수를 출력하는 변수
* -F 옵션 - 공백문자를 필드 구분자로 사용하지 않고 필드 구분자를 무엇으로 사용할지 지정하는 옵션.
* ~ 와 ! - ~는 특정 레코드나 필드내에서 일치하는 정규 표현식 패턴이 존재하는지 검사.
ex) # awk '$1 ~ /[aA]pple/' [파일명] --> 해당 파일의 첫번째 필드에 apple or Apple이 일치하는 것을 뽑아냄.
! 는 not이다. 반대되는 개념. 즉, 패턴과 일치하지 않는 것을 뽑아낸다.
ex) # awk '$1 !~ /[aA]pple/' [파일명] --> 해당 파일의 첫번째 필드에 apple or Apple와 일치하지 않는 것을..
예제 1> NR 변수를 사용하여 해당 awk 에 의해 몇 개의 레코드가 검색되었는지 맨 앞과 맨 뒤에 나타내라.
# awk '{print NR, $1, $2}' passfile
# awk '{print $1, $2, NR}' passfile -> {print 뒤를 순서대로 출력할 것이다. 즉, NR은 { }안의 어느 위치 든 쓸 수 있다.
예제 2> NF 변수를 사용하여 검색된 해당 레코드에 몇 개의 필드가 있는지 나타내라.
# awk '{print NF, $1, $3}' passfile --> 첫 번째와 3번째 필드만 출력하되 NF는 해당 레코드에 몇 개의 필드가 있는지 표시.
예제 3> -F옵션을 사용하여 : 를 구분자로 사용 하여 첫번째 필드와 세 번째 필드를 출력하라.
# awk -F : '{print $1, $3}' passwd --> -F [구분자] 를 :로 지정해 줬기 때문에 :를 기준으로 필드를 인식한다.
결과를 보면 :를 기준으로 첫번째와 세번째 필드가 출력됨을 알 수 있다.
예제 4> Tab으로 필드를 구분하여 첫번째와 세번째 필드를 출력하라.
# awk -F '[\t]' '{print $1, $3}' passfile --> Tab은 [\t] 이렇게 인식시킨다. ' '(싱글쿼터)로 묶어준 이유는 대괄호를
인식하는 것을 방지하기 위함이다.
그 외 예제>
* ":"구분자를 기준으로 필드를 나누며 root를 포함하는 행을 출력
# awk -F : '/root/{print $0}' [파일명] -->> 패턴으로 root문자열을 검색하여 print $0 즉, 해당 패턴이 있는 모든 필드를 출력.
* n이나 s로 시작하는 행의 첫 번째 필드를 출력
# awk '/^[ns]/{print $1}' [파일명]
* 네 번째 필드가 jun 으로 끝나면 문자열 NAME : 과 두번째 필드 및 마침표를 함께 출력
# awk '$4 ~ /jun$/{print "NAME :" $2"."}' [파일명]
LAB)
- /etc/passwd 파일에서 bash 쉘을 사용하는 유저의 계정명과 홈 디렉토리를 다음과 같은 형식으로 출력하시오
EX) USER : [계정명] HOME : [홈디렉토리]
# awk -F : '/bash${print "USER : ["$1"]", "\t\tHOME : ["$6"]"}' /etc/passwd
- Sed
- sed는 대화형 기능이 없는 편집기이다. 기본적으로 모든 행을 출력한다.
- 한 번에 한 행씩 처리하며, 결과를 화면으로 내보낸다. (리 다이렉션 > 을 통해 저장도 가능)
FORM
# sed '명령어' [파일명]
option
-n | 해당 패턴 or 실행 결과만을 출력 (기본적으로 출력되는 모든 행을 막는다.) |
-e | 다중 편집을 가능하게 해준다. |
sed 명령어 FORM(' '안에서 쓰인다.)
p | print 명령
사용자가 지정한 행을 출력 |
d | delete명령 사용자가 지정한 행을 삭제 ex) '3d' -> 3번째 행을 삭제 |
r | read명령 사용자가 지정한 행을 읽어온다 |
w | write명령 사용자가 지정한 행에 쓴다. |
a\ | append명령 검색된 패턴 아래 행에 내용을 덧붙인다. |
i\ | insert명령 검색된 패턴 위에 내용을 덧붙인다. a\와 사용법은 동일. |
예제 >
sed를 사용한 phone파일의 1행에서 3행까지 출력
- # sed '1,3p' phone -->> 1행에서 3행까지 p(print) 하겠다는 의미인데,
sed는 기본적으로 모든 행을 출력하고 매칭되는 패턴을 또 출력하게 된다..
- #sed -n '1,3p' phone --> 그래서 해당 패턴의 결과만을 출력하게 해주는 -n옵션을 사용했다.
- r(read)명령어 쓰기 FORM
# sed '/패턴/r [읽어올파일]' [패턴검색파일]
sed를 사용하여 aaa의 b패턴이 일치하는 행의 아래에 phone의 내용 출력
- # sed '/b/r phone' aaa --> aaa에서 b패턴을 검색하여 일치하는 행의 아래에 phone의 내용 출력
'System > Common' 카테고리의 다른 글
HP LoadRunner (0) | 2012.04.24 |
---|---|
로케일(Locale)이란 (0) | 2012.04.19 |
PATH 환경변수 우선순위 (0) | 2012.04.05 |
ssh와 sftp 사용 권한 설정 (0) | 2012.04.04 |
/bin/false VS /sbin/nologin (0) | 2012.04.04 |