'linux'에 해당되는 글 2건

  1. 2012.07.03 awk command
  2. 2011.09.20 find 명령어 위주 쉘명령어

awk command

2012. 7. 3. 11:22 from linux

awk

 

데이터 조작 및 보고서 생성에 사용되는 유닉스 프로그래밍 언어

 

1. awk 형식

 

  - 파일 입력

    . awk 'pattern' filename

    . awk '{action}' filename

    . awk 'pattern {action}' filename

    . 예제

      - awk '/Mary/' employee

      - awk '{print $1}' employee

      - awk '/Sally/{print $1, $2}' employee

        . 구분자는 공백

 

  - 명령으로 입력

    . command | awk 'pattern'

    . commnad | awk '{action}'

    . command | awk 'pattern {action}'

    . 예제

      - df | awk '$4 > 75000'

      - rusers | awk '/root$/{print $1}'

 

2. 출력 형식 지정

 

  - print 함수

    . awk는 일치된 줄을 출력하는 기본 동작을 수행

    . 변수, 계산 결과값이나 문자 상수를 매개변수로 받음

    . 문자열은 큰 따옴표로 묶고, 콤마는 매개변수를 분리하는데 사용

    . 콤마를 쓰지 않으면, 매개변수는 하나로 인식하고, 콤마는 출력 필드 구분자로 사용되며, 기본값은 공백

    . date | awk '{print "Month: " $2 " \nYear: ", $1}'

    . Escape Sequences(이스케이프 시퀀스)

      - 역슬래시(\)와 영문자 숫자로 표현


이스케이프 시퀀스 

 의미 

 \b

 백스페이스

 \f

 폼피드 (form feed)

 \n

 개행문자

 \r

 캐리지 리턴 (Carriage return)

 \t

 탭

 \047

 8진수 47, 작은 따옴표

 \c

 c는 다른 문자를 의미 예를 들어 \


      - awk '/Sally/{print "\t\tHave a nice day, " $1, $2 "!"}' employees 

       

  - OFMT 변수

    . 숫자에 서식을 지정해서 출력해야 할 경우

    . awk 'BEGIN{OFMT="%.2f"; print 1.245678, 12E-2}'

 

  - printf 함수

    . 표준 출력으로 형식화된 문장을 되돌려 줌

    . 개행문자가 필요하면 반드시 이스케이프 시퀀스로 지정

    . echo "UNIX" | awk '{printf "|%-15s|\n", $1}'

    . echo "UNIX" | awk '{printf "|%15s|\n", $1}'

    . awk '{printf "The name is: %-15s ID is %8d\n", $1, $2}' employees

    . printf 변환 문자


 문자 

 설명 

 c

 문자

 s

 문자열

 d

 10진수

 ld

 long형 10진수

 u

 부호없는 10진수

 lu

 long형 부호없는 10진수

 x

 16진수

 lx

 long형 16진수

 o

 8진수

 lo

 long형 8진수

 e

 부동소수점 숫자. 과학적 표기법(e-)

 f

 부동소수점 숫자

 g

 부동소수점 숫자. e나 f변환 중 적은 자리수를 차지 하는 표기법 사용


    . printf 수식어


 문자 

 설명 

 -

 왼쪽정렬 수식어

 #

 0으로 시작하는 8진법 형식의 정수를 표시 16진법 형식의 정수는 0x로 시작하여 표기

 +

 d,e,f,g를 이용하여 변환할때, 숫자를 부호 +,- 함께 출력

 0

 화이트 스페이스 대신 0으로 값을 채워 출력


    . printf 형식 지정자


 형식지정자

 동작 

 x='A', y=15, z=2.3, $1=Bob Smith 할당

 %c

 단일 ASCII문자 출력

printf("The character is %c.\n",x)

-> The character is A.

 %d

 10진수 출력

 printf("The boy is %d years old.\n",y)

-> The boy is 15 years old. 

 %e

 숫자를 e표기법으로 출력

 printf("z is %e.\n",z)

->z is 2.3e+01.

 %f

 부동소수점 숫자 출력

 printf("z is %f.\n",2.3*2)

->z is 4.600000.

 %o

 8진수 출력

 printf("y is %o.\n",y)

-> y is 17.

 %s

 문자 출력

 printf("The name of the culprit is %s.\n",$1)

-> The name of the culprit is Bob smith.

 %x

 16진수 출력

 printf("y is %x.\n",y)

-> y is f.

 

 

3. 파일에서 awk 명령 사용

 

  - awk -f awkfile emplyees

 

4. 레코드와 필드

  

  - 레코드

    . 레코드 구분자

      - 입출력시 레코드를 구분해 주는 구분자(행 구분자)는 기본적으로 캐리지 리턴(CR)

    . $0 변수

      - 전체 레코드를 참조

      - awk '{print $0}' employees

    . NR 변수

      - 각 레코드 번호는 awk 내장 변수인 NR에 저장. 레코드 처리가 끝난 후 NR값이 하나 증가

      - awk '{print NR, $0}' employees

 

  - 필드

    . 각 레코드는 기본적으로 화이트스페이스(공백, 탭)로 구분된 필드라는 단어들로 구성

    . awk '{print NR, $1, $2, $5}' employees

    . awk '{print NF, $0}' employees

    . 필드 구분자

      - 입력 필드 구분자

        . FS에는 입력 필드 구분자가 지정. 기본값은 스페이스, 탭

        . 명령줄에서 FS값을 변경하는 경우 -F 옵션과 함께 새로운 구분자를 지ㅓㅇ

          - awk -F: '/Tom Jones/{print $1, $2}' employees2

        . 두 개 이상의 입력 필드 구분자를 지정할 경우 대괄호([])에 표기

          - awk -F'[ :\t]' '{print $1, $2, $3}' employees2

            . 스페이스, 콜론(:), 탭

      - 출력 필드 구분자

        . 기본값은 스페이스이며, OFS 내장변수에 지정

        . print 문에서 각 필드를 구분하기 위해 사용한 콤마(,)는 무조건 OFS로 취급

          - awk -F: '/Tom Jones/{print $1, $2, $3, $4}' employees2

          - awk -F: '/Tom Jones/{print $0}' employees2

 

5. 패턴과 동작

 

  - 패턴

    . awk 패턴은 입력 줄을 awk가 어떻게 동작을 할 것인지를 제어

    . 기본 동작은 표현식의 결과가 참인 줄을 출력

    . awk '/Tom/' employees

    . awk '$3<4000' employess

 

  - 동작

    . 동작은 중괄호({})로 묵여 있으며, 세미콜론(;)으로 구분된 문장

    . {action}

    . {print $1, $2}

    . pattern{action statement; action statement; etc.}

    . pattern{

        action statement

        action statement

      }

    . awk '/Tom/{print "Hello there, "$1}' employees

      - 동작이 없는 패턴은 패턴과 일치하는 모든 줄을 출력

 

6. 정규표현식

 

  - awk에서의 정규표현식은 슬래시(\) 사이에 오는 문자들로 구성된 패턴

  - 정규표현식 메타문자의 사용을 허용

  - 정규표현식 메타문자

 

 메타문자

 의미 

 ^

 행의 시작 지시자 

 $

 행의 끝 지시자 

 .

 하나의 문자와 대응

 *

 선행문자와 같은 문자의 0개 혹은 염의 개수와 대응

 ?

 선행문자와 같은 문자

 [ABC]

 []사이의 문자 집합 중 하나와 대응. A or B or C

 [^ABC]

 []사이의 문자 집합에 속하지 않는 한 문자와 대응

 [A-Z]

 A-Z 문자 집합 중 하나와 대응

 A|B

 A나 B와 대응

 (AB)+

 하나 이상의 문자셋 AB와 대응. AB, ABAB, ABABAB

 \*

 문자로서의 *와 대응

 &

 검색열을 저장하여 지환열에서 사용할 수 있게 함

 

 

  - 전체 줄에서의 일치

    . 단일 정규표현식은 전체 줄의 패턴에 대한 일치 여부를 점검

    . 모든 줄이 일치되는 것으로 간주되어 출력

    . awk '/^Mary/' employees

    . awk '/^[A-z][a-z]+ /' employees

      - 대문자로 시작하고, 하나 이상의 소문자가 오며, 이어서 스페이스가 오는 줄을 표시

 

  - match 연산자(~, tilde)

    . 특정 레코드나 필드 내에서 일치하는 정규표현식 패턴이 존재하는지 검사

    . awk '$1~/[Bb]ill/' employees

    . awk '$1!~/ly$/' employees

      - 첫번째 필드가 ly로 끝ㄴ지 않는 행들을 출력

    . POSIX 문자 항목

      - the Porable Operating System Interface는 프로그램들이 운영체제간의 상호 호환이 가능하도록 보증하는 산업표준

      - POSIX로 추가된 대괄호 문자 클래스   

 

 대괄호

 클래스 의미 

 [:alnum:]

 알파벳과 숫자 문자

 [:alpha:]

 알파벳 문자 

 [:cntrl:]

 제어 문자

 [:digit:]

 숫자 문자 

 [:graph:]

 공백이 아닌 문자(스페이스,제어문자등이 아닌 문자)

 [:lower:]

 소문자

 [:print:]

 [:graph:]와 유사하지만 공백을 포함

 [:punct:]

 구두점

 [:space:] 

 모든 공백문자(개행,스페이스,탭)

 [:upper:]

 대문자

 [:xdigit:]

 16진수(0-9a-fA-F)

 

        . awk '/[[:lower:]]+g[[:space:]]+[[:digit:]]/' employees

          - 하나 이상의 소문자와 이어서 g, 하나이상의 스페이스, 숫자가 오는 패턴 검사

 

7. 스크립트 파일 안의 awk 명령

 

  - awk -F: -f info employees2

 

8. 리뷰

 

  - 간단한 패턴 매칭

    . awk '/west/' datafile

    . awk '/^north/' datafile

    . awk '/(no|so)/' datafile

  

  - 간단한 동작

    . awk '{print $3, $2}' datafile

    . awk '{print $3 $2}' datafile

    . awk '{print $0}' datafile

    . awk '{print "Number of fields: "NF}' datafile

   

  - 패턴과 동작이 조합된 정규 표현

    . awk '/northeast/{print $3, $2}' datafile

    . awk '/E/' datafile

    . awk '/^[ns]/{print $1}' datafile

    . awk '$5~/\.[7-9]+/' datafile

    . awk '$2!~/E/{print $1, $2}; datafile

    . awk '$3~/^Joel/{print $3 " is a nice guy."}' datafile

    . awk '$8~/[0-9][0-9]$/{print $8}' datafile

    . awk '$4!/Chin$/{print "The price is $" $8 "."}' datafile

    . awk '/TJ/{print $0}' datafile

 

  - 입력 필드 구분자

    . awk '{print $1}' datafile2

    . awk -F: '{print $1}' datafile2

    . awk '{print "Number of fields: "NF}' datafile2

    . awk -F: '{print "Number of fields: "NF}' datafile2

    . awk -F"[ :]" '{print $1, $2}' datafile2

 

 

9. 비교식

 

  - 관계 연산자

    . 값이 1이면 참, 0이면 거짓

 

 연산자

 의미 

 예제 

 <

 작은 

 x<y 

 <=

 작거나 같은 

 x<=y 

 ==

 같은 

 x==y 

 !=

 같지 않은 

 x!=y 

 >=

 크거나 같은 

 x>=y 

 >

 큰 

 x>y 

 ~

 정규 표현식과 같은 

 x~/y/ 

 !~

 정규 표현식과 같지 않은

 x!~/y/

 

 

    . awk '$3==5346' employees

    . awk '$3>5000{print $1}' employees

    . awk '$2~/Adam/' employees

    . awk '$2!~/Adam/' employees

 

  - 조건식

    . 물음표(?), 콜론(:) 기호 두 개를 사용하여 식을 평가

    . 조건식1?구문2:구문3

    . awk '{max=($1>$2)?$1:$2;print max}' filename

      if($1>$2)

        max=$1

      else

        max=$2

 

  - 산술계산

    . 산술계산은 패턴 안에서 이루어진다. 모든 산술계산은 부동소수점으로 변환한 후 처리

 

 연산자

 의미 

 예제 

 +

 더하기

 x+y

 -

 빼기

 x-y

 *

 곱하기

 x*y

 /

 나누기

 x/y

 %

 나머지

 x%y

 ^

 지수

 x^y

 

    . awk '$3*$4>500' filename

 

  - 논리 연산과 결합 패턴

 

 연산자

 의미 

 예제 

 &&

 논리 AND

 a&&b

 ||

 논리 OR

 a||b

 !

 NOT

 !a

 

    . awk '$2>5 && $2<=15' filename

    . awk '$3==100 || $4>50' filename

    . awk '!($2<100 && $3<20) filename

 

  - 범위 패턴

    . 첫번째 패턴부터 두번째 패턴까지 선택

    . awk '/Tom/,/Suzanne/' filename

 

  - 데이터 검증 프로그램

    . 패스워드 검사 포스트 참고

 

10. 리뷰

 

  - 동일성 검사

    . awk '$7==5' datafile

    . awk '$2=="CT" {print $1, $2}' datafile

    . awk '$7!=5' datafile

 

  - 관계 연산자

    . awk '$7<5 {print $4, $7}' datafile

    . awk '$6>.9 {print $1, $6}' datafile

    . awk '$8<=17 {print $8}' datafile

    . awk '$8>=17 {print $8}' datafile

 

  - 논리 연산자

    . awk '$8>10 && &8<17' datafile

    . awk '$2=="NW" || $1~/south/{print $1, $2}' datafile

 

  - 논리 NOT 연산자(!)

    . awk '!($8==13) {print $8}' datafile

 

  - 산술 연산자

    . awk '/southern/ {print $5+10}' datafile

    . awk '/southern/ {print $8-10}' datafile   

    . awk '/southern/ {print $8/2}' datafile

    . awk '/southern/ {print $8*10}' datafile

    . awk '/southern/ {print $8%3}' datafile

    . awk '$3~/^Susan/ {print "Percentage: "$6+.2 " Volume: "$8}' datafile

  

  - 범위 연산자

    . awk '/^western/,/^eastern/' datafile

 

  - 조건 연산자

    . awk '{print ($7>4 ? "high "$7 : "low "$7)}' datafile

 

  - 대입 연산자

    . awk '$3=="Chris"{$3="Christing;print}' datafile

    . awk '/Derek/{$8 += 12; print $8}' datafile

    . awk '{$7 %= 3; print $7}' datafile

 

http://blog.naver.com/illi0001?Redirect=Log&logNo=140111224551

 

'linux' 카테고리의 다른 글

find 명령어 위주 쉘명령어  (0) 2011.09.20
Posted by 에시드 :

find 명령어 위주 쉘명령어

2011. 9. 20. 01:08 from linux

# .svn이 포함된 파일 삭제
find . -name '.svn*' -exec rm -rf {} \;

 

# 30일 이전 데이타 조회
find /data/xxxxxx/log/888log -mtime -30 -mtime +0 -exec ls -l {} \; | wc -l
find /data/xxxxxx/spool/logupload -mtime -30 -mtime +0 -exec ls -l {} \; | wc -l

 

# 30일 이전 데이타 이동
find /data/xxxxxx/log/888log -mtime -30 -mtime +0 -exec mv {} . \;
find /data/xxxxxx/spool/logupload -mtime -30 -mtime +0 -exec mv {} . \;

 

# 리스트 목록 갯수 확인
ls -al | wc -l

 

#hack이라는 문자가 포함되있는 파일 검색
find ./ -name "*" -exec grep -H hack [] \;
find ./ -type f -print | xargs grep -H "hack" /dev/null
find ./ -type f -exec grep 'hack' {} /dev/null \;
egrep -r hack *

 

# 전체 디렉토리에서 소유자의 uid가 427인 파일들을 보여준다
find / -user 427 -print

 

# 최근 5분안에 생성되거나 업데이트 된 파일을 보여준다
find / -cmin -5

 

# 일반 유저가 쓰기 권한이 있는 디렉토리를 보여준다.
find / -perm -0002 -type d -print

 

# 일반유저가 쓰기 권한이 있는 파일을 보여준다
find / -perm -0002 -type f -print

 

# 유저나 그룹이 없는 파일을 보여준다
find / -nouser -o -nogroup -print

 

# 지난 2일 사이에 변경된 파일을 보여준다.
find / -mtime 2 -o -ctime 2

 

# 현재위치에서 하위 디렉토리까지 파일 찾기
find . -name "sample.txt"

 

# 현재위치에서 하위 디렉토리까지 sample 문자열 포함하는 파일 찾기
find . -name "*sample*"

 

#  현재위치에서 하위 디렉토리까지 ".txt"로 끝나는 파일 찾고 찾은파일안에 sample 단어가 있는 내용을 출력
find . -print "*.txt" | xargs grep "파일명 or 문자열" // 파일명 or 문자열이 들어있는 행 모두 화면에 출력
find . -name "*.txt" -exec grep "sample" {} \; // 파일명은 출력 안하고 찾고자 하는 문자열의 행만 출력
find . -name "*.txt" | xargs grep "sample"

 

# 현재위치에서 -type d(디렉토리찾기) 디렉토리를 찾는데 이름이 sample로 시작하는 디렉토리만 찾기
find . -type -d -name "sample*"

 

# 현재위치에서 파일만 찾는데 sample로 시작하는 단어를 찾고 찾은 파일중 현재일자로부터 2일전 파일만 찾기
find . -type f -name "sample*" -mtime 2

 

 

 

'linux' 카테고리의 다른 글

awk command  (0) 2012.07.03
Posted by 에시드 :