본문으로 바로가기

[Linux] 리눅스 파일의 원하는 행과 열 출력 - awk

category OS/Linux 2021. 9. 25. 19:02

목차

    1. awk 명령어

    1. awk program 파일로부터 awk program을 실행
    # awk [options] -f awkProgramFile file ...
    
    2. awk program 파일 없이 awk program을 실행
    awkProgram = 'Patterns {Actions}'
    
    # awk [options] 'awkProgram' file ...
    # awk [options] 'Patterns {Actions}' file ...

     텍스트 형태로 되어있는 입력 데이터를 행과 단어(필드) 별로 처리해 출력하는 명령어

    awk 명령어를 이용해 해당 파일의 데이터를 분류(레코드, 필드) 후, 분류된 텍스트를 바탕으로 데이터 조작 및 연산, 조건 검사 등을 수행 후 출력하는 명령어(프로그래밍 언어, 텍스트 프로세싱 기능)

    AWK라는 명령어 이름은 명령어를 만든 Aho + Weinberger + Kernighan 이름의 앞 글자를 따서 붙여졌습니다.

    awk는 데이터를 조작할 수 있어 쉘 스크립트에서 사용되는 필수 툴이며, 작은 데이터베이스를 관리하기 위해서도 필수입니다.

    perl 언어 등장 이후로, awk는 길어지면 복잡해져 사용빈도가 급격히 줄었습니다.

    one-liner(한 줄로 작성하여 동작하는 프로그램)로서 많이 쓰입니다.

    1.1. 레코드와 필드

    awk 레코드와 필드

    [레코드]

    awk는 기본적으로 입력 데이터를 라인(line) 단위의 레코드(Record)로 인식합니다. ($0 = 레코드)

    레코드는 $0로 접근할 수 있습니다.

     NR(total number of record so far) 변수 : 각 레코드들의 번호는 awk의 Built-in Variables 변수 NR에 저장됩니다.

    # cat awk_ex
    aapl    apple                   nasdaq  37%     $146.8300
    msft    microsoft               nasdaq  32%     $299.5600
    tsla    tesla                   nasdaq  16%     $753.6400
    nvda    nvidia                  nasdaq  70%     $224.8200
    net     cloudflare              nyse    224%    $135.6700
    qld     proetf_ultra_qqq        nyse    2%      $79.2000
    
    # awk '{print NR}' awk_ex
    1
    2
    3
    4
    5
    6

     

    [필드]

    각 레코드에 들어 있는 텍스트는 공백 문자(space, tab)로 구분필드(Field)들로 분류됩니다.
    필드는 구분자로 분리되며 $1부터 $n(필드 개수)를 이용해 접근할 수 있습니다.

     NF(the number of fields) 변수 : 총필드의 수를 awk의 Built-in Variables 변수 NF에 저장되고, 라인당 100개의 필드를 가질 수 있다.

    # awk '{print NF}' awk_ex
    5
    5
    5
    5
    5
    5

     

    [필드 분리자]

    필드 분리자는 awk의 Built-in Variables 변수 FS에 저장되고 기본 값은 공백과 탭입니다.

    -F옵션을 사용해 FS(분리자) 값을 변경할 수 있습니다.

    # cat awk_ex2
    aapl:apple:nasdaq:37%:$146.8300
    msft:microsoft:nasdaq:32%:$299.5600
    tsla:tesla:nasdaq:16%:$753.6400
    nvda:nvidia:nasdaq:70%:$224.8200
    net:cloudflare:nyse:224%:$135.6700
    qld:proetf_ultra_qqq:nyse:2%:$79.2000
    
    # awk -F: '{ print $2 }' awk_ex2
    apple
    microsoft
    tesla
    nvidia
    cloudflare
    proetf_ultra_qqq

    1.2. awk 명령어 작업 방식

     awk 명령어의 작업 처리 방식입니다.

    awk 명령어 입력파일 처리방식

    결괏값

    # cat awk_ex
    aapl    apple                   nasdaq  37%     $146.8300
    msft    microsoft               nasdaq  32%     $299.5600
    tsla    tesla                   nasdaq  16%     $753.6400
    nvda    nvidia                  nasdaq  70%     $224.8200
    net     cloudflare              nyse    224%    $135.6700
    qld     proetf_ultra_qqq        nyse    2%      $79.2000
    
    # awk '$4 > 20 {print $0}' awk_ex
    aapl    apple                   nasdaq  37%     $146.8300
    msft    microsoft               nasdaq  32%     $299.5600
    nvda    nvidia                  nasdaq  70%     $224.8200
    net     cloudflare              nyse    224%    $135.6700

    1.3. awk Options

     다양한 옵션이 많지만 주요 옵션만 기술했습니다. 다른 옵션이 필요하면 man awk를 이용해 확인해주세요.

    [OPTIONS]

     -f program-file
     --file program-file

      : awk 프로그램 파일을 지정합니다.

     

     -F fs
     --field-separator fs

      : 필드 구분 기호를 지정합니다. (지정한 구분 기호로 필드를 구분)

     

     -v var=val
     --assign var=val

      : awk 프로그램에서 사용할 변수를 지정합니다.

     

    -b
    --characters-as-bytes

    -c
    --traditional

    -C
    --copyright

     

    ( ... ) 생략

    1.4. awk Program

     awk Program은 스크립트 형식의 프로그래밍 언어로 작성되기 때문에, 작성 방법이 매우 다양합니다.

    # awk [options] 'awkProgram' file ...

    # awk [options] 'Patterns {Actions}' file ...

     

    [awk 입력 파일 처리 형태]

     1. 파일을 한 줄씩(레코드) 스캔합니다.
     2. 각 레코드를 구분자에 따라(space, tab 등) 필드로 나눕니다.
     3. 레코드와 필드를 패턴과 비교합니다. = 'Patterns {Actions}'
     4. 일치하는 줄에서 작업을 수행합니다. = 'Patterns {Actions}'
     5. 이러한 과정을 입력 파일의 끝이 나올 때까지 수행합니다.

     

    [생략]

     pattern과 action은 모두 생략이 가능합니다.

     pattern을 생략
    : 매칭 여부를 검사할 문자열 패턴 정보가 없기 때문에 모든 레코드가 선택됩니다.
     action을 생략
    : 기본 액션인 print가 실행됩니다.

     

     패턴과 액션 생략 예시입니다. | (파이프라인)을 이용해서 사용할 수도 있습니다.

    # ps -f
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      5046 13140  0 18:35 pts/1    00:00:00 sleep 1
    root      5047 19050  0 18:35 pts/1    00:00:00 ps -f
    root     13140 19050  0 13:57 pts/1    00:00:22 sh test.sh
    root     19050 19032  0 11:46 pts/1    00:00:02 -bash
    
    [pattern 생략]
    # ps -f | grep -v awk | awk '{print}'
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      5263 13140  0 18:35 pts/1    00:00:00 sleep 1
    root      5264 19050  0 18:35 pts/1    00:00:00 ps -f
    root     13140 19050  0 13:57 pts/1    00:00:22 sh test.sh
    root     19050 19032  0 11:46 pts/1    00:00:02 -bash
    
    [action 생략]
    # ps -f | grep -v awk | awk '/sleep 1/'
    root      5414 13140  0 18:36 pts/1    00:00:00 sleep 1

    1.4.1. Built-in Variables(내장 변수)

     특수 목적으로 미리 정의된 변수입니다. 자주 사용하는 변수만 기술했습니다. 더 자세한 내용은 man awk를 참조해주세요.

    [내장 변수]

    FS

      : 필드 구분 문자 (default = space)

    NF

      : 레코드의 필드 개수

    NR

      : 현재 레코드의 순서 값

    FNR

      : 현재 파일에서 현재 레코드의 순서 값(다수의 파일을 처리할 때 사용)

    RS

      : 레코드 구분 문자 (default = newline)

    OFMT

      : 숫자의 출력 형식 제어 (printf와 비슷함) (default =  %.6g)

    OFS

      : 결과 출력 시 필드 구분 문자 (default = space)

    ORS

      : 결과 출력 시 레코드 구분 문자 (default = newline)

    FILENAME

      : 경로 포함한 파일명

    CONVFMT

      : 문자열 숫자를 숫자로 변환 형식 (default =  %.6g)

    RLENGTH

      : match()와 일치하는 문자열의 길이. 일치하는 항목이 없으면 -1입니다.
    RSTART

      : match()와 일치하는 첫 번째 문자의 인덱스; 일치하지 않으면 0입니다. (인덱스는 1에서 시작

    1.4.2. Patterns

    [Patterns]

    BEGIN
    END
    BEGINFILE
    ENDFILE
    /regular expression/
    relational expression
    pattern && pattern
    pattern || pattern
    pattern ? pattern : pattern
    (pattern)
    ! pattern
    pattern1, pattern2

    1.4.3. etc

    그 외에 다양한 프로그래밍적 요소(함수, 연산자, 입/출력 등이 있습니다.)

    [수학 함수]
    atan2(y, x),   cos(expr),   exp(expr),   int(expr),   log(expr), 

    rand(),   sin(expr),   sqrt(expr),   srand([expr]), 

    ( ... ) 생략


    [문자열 함수]
    asort(s [, d [, how] ]), asorti(s [, d [, how] ]), index(s, t), 

    match(s, r [, a]) , split(s, a [, r [, seps] ]), substr(s, i [, n])
    ( ... ) 생략


    [시간 함수]
    mktime(datespec), systime(), strftime([format [, timestamp[, utc-flag]]])

    [사용자 정의 함수]
    function name(parameter list) { statements }

    function  f(p, q,     a, b)   # a and b are local
    {
       ...
    }

    /abc/     { ... ; f(1, 2) ; ...

     

    [연산자]

    $           

    : Field reference.
    ++ --       

    : Increment and decrement, both prefix and postfix.
    ^           

    : Exponentiation (** may also be used, and **= for the assignment operator).
    + - !       

    : Unary plus, unary minus, and logical negation.
    * / %       

    : Multiplication, division, and modulus.
    + -         

    : Addition and subtraction.
    ~ !~        

    : Regular expression match, negated match.  
    &&          

    : Logical AND.
    ||          

    : Logical OR.
    = += -= *= /= %= ^=
    < > <= >= != ==

    ( ... ) 생략

     

    [제어문]

    if (condition) statement [ else statement ]
    while (condition) statement
    do statement while (condition)
    for (expr1; expr2; expr3) statement
    for (var in array) statement
    break
    continue

    ( ... ) 생략

     

    [입출력]

    getline

    print

    printf

    ( ... ) 생략

     


    2. awk 예제

    예제로 사용할 파일 내용입니다.

    # cat awk_ex
    AAPL    APPLE                   NASDAQ  37%     146.8300
    msft    microsoft               nasdaq  32%     299.5600
    tsla    tesla                   nasdaq  16%     753.6400
    nvda    nvidia                  nasdaq  70%     224.8200
    net     cloudflare              nyse    224%    135.6700
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    
    # cat awk_ex2
    AAPL:APPLE:NASDAQ:37%:146.8300
    msft:microsoft:nasdaq:32%:299.5600
    tsla:tesla:nasdaq:16%:753.6400
    nvda:nvidia:nasdaq:70%:224.8200
    net:cloudflare:nyse:224%:135.6700
    qld:proetf_ultra_qqq:nyse:2%:79.2000
    
    # cat number
    20 50 70 80 20
    30 50 70 40 60
    80 90 80 50 40
    50 10 40 60 20
    
    # cat awk_program.script
    {
            if(NR==1) max=$5
    }
    
    {
            if($5>max)max=$5
    }
    
    END{
            print max+0
    }

    2.1. 원하는 필드 값 출력

    [연산자]
    $          
    : Field reference.

     

    [이스케이프 시퀀스]
    \b 백스페이스
    \n 줄 바꿈, 개행
    \t 수평 탭
    \v 수직 탭

     

    원하는 n번 필드 값 출력(1~n)

    print $n;

    # awk '{print $n }' file

     

    [파일 출력]

    [1,5번 필드 출력]
    # awk '{print $1,$5}' awk_ex
    AAPL 146.8300
    msft 299.5600
    tsla 753.6400
    nvda 224.8200
    net 135.6700
    qld 79.2000
    
    [\t	수평 탭]
    # awk '{print $1 "\t" $5}' awk_ex
    AAPL    146.8300
    msft    299.5600
    tsla    753.6400
    nvda    224.8200
    net     135.6700
    qld     79.2000
    
    [임의의 문자열 추가(포함)하기]
    # awk '{print "company: "$1, "\t",  "price: "$5}' awk_ex
    company: AAPL    price: 146.8300
    company: msft    price: 299.5600
    company: tsla    price: 753.6400
    company: nvda    price: 224.8200
    company: net     price: 135.6700
    company: qld     price: 79.2000

    [다른 명령어와 활용 - 파이프라인]

    [테스트를 위한 작업]
    sleep 50000 &
    sleep 50001 &
    sleep 50002 &
    sleep 50003 &
    sleep 50004 &
    
    [프로세스 원하는 정보만 출력]
    # ps -ef | grep sleep | grep -v grep | awk '{print "PID: " $2 "\t" "COMMAND: " $8, $9}'
    PID: 14979      COMMAND: sleep 50000
    PID: 14980      COMMAND: sleep 50001
    PID: 14981      COMMAND: sleep 50002
    PID: 14982      COMMAND: sleep 50003
    PID: 14984      COMMAND: sleep 50004
    PID: 15280      COMMAND: sleep 60
    PID: 15501      COMMAND: sleep 10
    
    [netstat 원하는 정보만 출력]
    # netstat -ntap | grep sshd | awk '{print "Local Address: " $4, "\t","State: " $6}'
    Local Address: 0.0.0.0:22        State: LISTEN
    Local Address: 127.0.0.1:6010    State: LISTEN
    Local Address: 192.168.50.14:22          State: ESTABLISHED
    Local Address: 192.168.50.14:22          State: ESTABLISHED
    Local Address: 192.168.50.14:22          State: ESTABLISHED
    Local Address: :::22     State: LISTEN
    Local Address: ::1:6010          State: LISTEN

    2.2. 원하는 레코드 값 출력

    $0 = 레코드

    [Built-in Variables]

    NR(total number of record so far)

     : 현재 레코드의 순서 값

     

    [전체 레코드 출력]

    # awk '{print $0}' 파일명 

     

    [원하는 레코드 출력]

    : 연산자나 제어문을 이용(프로그래밍 언어)

    : exit를 이용해 원하는 n 레코드 출력 후 작업 stop

    # awk 'NR == n {print $0; exit}' 파일명

    : 짝수 레코드

    # awk 'NR%2 == 0 {print $0}' 파일명 

    : 홀수 레코드(1=true)

    # awk 'NR%2 {print $0}' 파일명

    # awk 'NR == 2 {print NR,$0; exit}' awk_ex
    2 msft  microsoft               nasdaq  32%     299.5600
    
    # awk 'NR%2 == 0 {print NR,$0}' awk_ex
    2 msft  microsoft               nasdaq  32%     299.5600
    4 nvda  nvidia                  nasdaq  70%     224.8200
    6 qld   proetf_ultra_qqq        nyse    2%      79.2000
    
    # awk 'NR%2 {print NR,$0}' awk_ex
    1 AAPL  APPLE                   NASDAQ  37%     146.8300
    3 tsla  tesla                   nasdaq  16%     753.6400
    5 net   cloudflare              nyse    224%    135.6700
    
    # awk 'NR > 2 && NR < 6 {print NR, $0}' awk_ex
    3 tsla  tesla                   nasdaq  16%     753.6400
    4 nvda  nvidia                  nasdaq  70%     224.8200
    5 net   cloudflare              nyse    224%    135.6700

    2.3. 원하는 데이터 출력하기

     패턴에 정규 표현식(Regular Expression)을 사용하여 원하는 패턴을 검사할 수 있습니다.

    # awk '/regex/' 파일명

    # awk '/APPLE/' awk_ex
    AAPL    APPLE                   NASDAQ  37%     146.8300
    
    # awk '/APPLE/ {print $1}' awk_ex
    AAPL
    
    # awk '/^n/ {print $0}' awk_ex
    nvda    nvidia                  nasdaq  70%     224.8200
    net     cloudflare              nyse    224%    135.6700
    
    # awk '/[[:lower:]]/ {print $0}' awk_ex
    msft    microsoft               nasdaq  32%     299.5600
    tsla    tesla                   nasdaq  16%     753.6400
    nvda    nvidia                  nasdaq  70%     224.8200
    net     cloudflare              nyse    224%    135.6700
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    
    # awk '/[[:upper:]]/ {print $0}' awk_ex
    AAPL    APPLE                   NASDAQ  37%     146.8300

    2.4. 원하는 데이터 출력 (필드 값 문자열 검사)

     특정 필드 문자열 패턴 검사

    : match($필드, /패턴/) 이용

    : ~ 연산자 이용 (정규식 연산자)

    # awk 'match($n, /regex/) {print $0}' 파일명

    # awk '$n ~ /regex/ {print $0}' 파일명

    # awk 'match($3,/nas*/) {print $0}' awk_ex
    msft    microsoft               nasdaq  32%     299.5600
    tsla    tesla                   nasdaq  16%     753.6400
    nvda    nvidia                  nasdaq  70%     224.8200
    
    # awk '$3 ~ /nas*/ {print $0}' awk_ex
    msft    microsoft               nasdaq  32%     299.5600
    tsla    tesla                   nasdaq  16%     753.6400
    nvda    nvidia                  nasdaq  70%     224.8200
    
    # awk '!match($3,/nas*/) {print $0}' awk_ex
    AAPL    APPLE                   NASDAQ  37%     146.8300
    net     cloudflare              nyse    224%    135.6700
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    
    # awk '$3 !~ /nas*/ {print $0}' awk_ex
    AAPL    APPLE                   NASDAQ  37%     146.8300
    net     cloudflare              nyse    224%    135.6700
    qld     proetf_ultra_qqq        nyse    2%      79.2000

     

    2.5. 출력 너비 지정하기

    printf를 이용해 지저분한 출력을 이쁘게 출력할 수 있습니다.

     출력 포맷은 C 언어와 동일합니다.

    # df -h | awk '{print $1, $5}'
    Filesystem Use%
    devtmpfs 0%
    tmpfs 0%
    tmpfs 4%
    tmpfs 0%
    /dev/mapper/centos-root 11%
    /dev/sda1 19%
    /dev/mapper/centos-home 1%
    tmpfs 1%
    tmpfs 0%
    
    # df -h | awk '{printf "%-30s %-3s \n", $1, $5}'
    Filesystem                     Use%
    devtmpfs                       0%
    tmpfs                          0%
    tmpfs                          4%
    tmpfs                          0%
    /dev/mapper/centos-root        11%
    /dev/sda1                      19%
    /dev/mapper/centos-home        1%
    tmpfs                          1%
    tmpfs                          0%
    
    # df -h | awk '{printf "%30s %3s \n", $1, $5}'
                        Filesystem Use%
                          devtmpfs  0%
                             tmpfs  0%
                             tmpfs  4%
                             tmpfs  0%
           /dev/mapper/centos-root 11%
                         /dev/sda1 19%
           /dev/mapper/centos-home  1%
                             tmpfs  1%
                             tmpfs  0%

     

    2.6. 특정 필드의 합 출력 

    # awk '{ price_sum += $5 }; END { print "TOTAL_PRICE : $"price_sum }' awk_ex
    TOTAL_PRICE : $1639.72

    2.7. 특정 필드 기준으로 레코드 중 최솟값, 최댓값 출력(세로의 최솟값, 최댓값)

    # cat awk_ex
    AAPL    APPLE                   NASDAQ  37%     146.8300
    msft    microsoft               nasdaq  32%     299.5600
    tsla    tesla                   nasdaq  16%     753.6400
    nvda    nvidia                  nasdaq  70%     224.8200
    net     cloudflare              nyse    224%    135.6700
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    
    [최솟값]
    # awk 'NR==1{min=$5} $5<min{min=$5} END{print min+0}' awk_ex
    또는
    # awk '{if(NR==1) min=$5} {if($5<min) min=$5} END{print min+0}' awk_ex
    753.64
    
    [최댓값]
    # awk 'NR==1{max=$5} $5>max{max=$5} END{print max+0}' awk_ex
    또는
    # awk '{if(NR==1) max=$5} {if($5>max)max=$5} END{print max+0}' awk_ex
    79.2
    
    # awk 'NR==1{max=$5; min=$5} $5>max{max=$5} $5<min{min=$5} END{print "max: "max+0, "\t min: "min+0}' awk_ex
    max: 753.64      min: 79.2

    2.8. 필드 중 최솟값, 최댓값 구하기(가로의 최솟값, 최댓값)

    # cat number
    20 50 70 80 20
    30 50 70 40 60
    80 90 80 50 40
    50 10 40 60 20
    
    [최솟값]
    # awk '{min = $1; for(i=1; i<=NF; i++) if($i < min) min = $i; print min}' number
    20
    30
    40
    10
    
    [최댓값]
    # awk '{max = $1; for(i=1; i<=NF; i++) if($i > max) max = $i; print max}' number
    80
    70
    90
    60

    2.8. 특정 필드 기준으로 정렬

    | sort를 사용해 정렬합니다.

     awk 프로그램에서 파이프를 오픈하고 다른 파이프를 오픈하기 전에 기존 파이프는 닫아야 합니다.
    파이프 심벌의 오른쪽 명령은 큰따옴표(““)로 둘러싸야합니다.

     

    [options]

    -k : 필드 번호
    -g : 숫자일 경우
    -r : 내림차순 (default 오름차순)
    -t "구분자"

    [1번 필드 오름차순 정렬]
    # awk '{print $0 | "sort -k 1"} END{close("sort -k 1")}' awk_ex
    AAPL    APPLE                   NASDAQ  37%     146.8300
    msft    microsoft               nasdaq  32%     299.5600
    net     cloudflare              nyse    224%    135.6700
    nvda    nvidia                  nasdaq  70%     224.8200
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    tsla    tesla                   nasdaq  16%     753.6400
    
    [1번 필드 내림차순 정렬]
    # awk '{print $0 | "sort -k 1 -r"} END{close("sort -k 1 -r")}' awk_ex
    tsla    tesla                   nasdaq  16%     753.6400
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    nvda    nvidia                  nasdaq  70%     224.8200
    net     cloudflare              nyse    224%    135.6700
    msft    microsoft               nasdaq  32%     299.5600
    AAPL    APPLE                   NASDAQ  37%     146.8300
    
    [5번 필드 오름차순 정렬(숫자)]
    # awk '{print $0 | "sort -k 5 -g"} END{close("sort -k 5 -g")}' awk_ex
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    net     cloudflare              nyse    224%    135.6700
    AAPL    APPLE                   NASDAQ  37%     146.8300
    nvda    nvidia                  nasdaq  70%     224.8200
    msft    microsoft               nasdaq  32%     299.5600
    tsla    tesla                   nasdaq  16%     753.6400
    
    [5번 필드 내림차순 정렬(숫자)]
    # awk '{print $0 | "sort -k 5 -g -r"} END{close("sort -k 5 -g -r")}' awk_ex
    tsla    tesla                   nasdaq  16%     753.6400
    msft    microsoft               nasdaq  32%     299.5600
    nvda    nvidia                  nasdaq  70%     224.8200
    AAPL    APPLE                   NASDAQ  37%     146.8300
    net     cloudflare              nyse    224%    135.6700
    qld     proetf_ultra_qqq        nyse    2%      79.2000

    2.9. BEGIN, END

    [Patterns]

    # awk 'BEGIN {} {} END {}' 파일명

    # awk 'BEGIN{print "[BEGIN CODE HERE]"}; {print $0}; END{print "[END CODE HERE]"}' awk_ex
    [BEGIN CODE HERE]
    AAPL    APPLE                   NASDAQ  37%     146.8300
    msft    microsoft               nasdaq  32%     299.5600
    tsla    tesla                   nasdaq  16%     753.6400
    nvda    nvidia                  nasdaq  70%     224.8200
    net     cloudflare              nyse    224%    135.6700
    qld     proetf_ultra_qqq        nyse    2%      79.2000
    [END CODE HERE]

    2.10. 필드 구분자 변경하기

    # awk -F 구분자 'awk Program' 파일명

    # cat awk_ex2
    AAPL:APPLE:NASDAQ:37%:146.8300
    msft:microsoft:nasdaq:32%:299.5600
    tsla:tesla:nasdaq:16%:753.6400
    nvda:nvidia:nasdaq:70%:224.8200
    net:cloudflare:nyse:224%:135.6700
    qld:proetf_ultra_qqq:nyse:2%:79.2000
    
    # awk -F : '{print $1, $5}' awk_ex2
    AAPL 146.8300
    msft 299.5600
    tsla 753.6400
    nvda 224.8200
    net 135.6700
    qld 79.2000
    
    # awk -F : '{printf "%-10s %-20s \n", $1, $5}' awk_ex2
    AAPL       146.8300
    msft       299.5600
    tsla       753.6400
    nvda       224.8200
    net        135.6700
    qld        79.2000

    2.11. 파일로 저장된 awk 프로그램 실행

    # awk -f 프로그램파일명 'awk Program' 파일명

    # cat awk_program.script
    {
            if(NR==1) max=$5
    }
    
    {
            if($5>max)max=$5
    }
    
    END{
            print max+0
    }
    
    # awk -f awk_program.script awk_ex
    753.64

    2.10. 리다이렉션(>, >>)

     파일명은 큰따옴표로 둘러쌰아 합니다.

    # awk '{printf "%-5s %-5s %-20s \n", $1, $4, "$"$5 > "new_file"}' awk_ex
    
    # cat new_file
    AAPL  37%   $146.8300
    msft  32%   $299.5600
    tsla  16%   $753.6400
    nvda  70%   $224.8200
    net   224%  $135.6700
    qld   2%    $79.2000

    2.11. 프로세스 이름으로 KILL

    [쉘 스크립트에서의 쿼테이션과 백 틱]

    ' (single quotation)

    : ' ~ ' 안에서는 문법을 무시합니다. ($ no)

    " (double quotation)

    : " ~ " 안에서는 문법을 허용합니다. ($ ok)

    ` (backtick)

    : 일반적으로 키보드 왼쪽 Tab 위에 위치하고 있습니다.

    : ` ~ ` 안에서는 명령어가 실행 가능합니다.

     

    [쿼테이션과 백 틱 차이 예시]

    [변수 선언]
    # var=3
    
    [single quotation 변수 출력]
    # echo '$var'
    $var
    
    [double quotation 변수 출력]
    # echo "$var"
    3
    
    [single quotation 명령어 사용]
    # echo 'expr $var + 2'
    expr $var + 2
    
    [double quotation 명령어 사용]
    # echo "expr $var + 2"
    expr 3 + 2
    
    [backtick 명령어 사용]
    # echo `expr $var + 2`
    5

    [프로세스 이름으로 프로세스 KILL]

    [1. 테스트를 위해 백그라운드 프로세스 생성]
    # sleep 50000 &
    # sleep 50001 &
    # sleep 50002 &
    # sleep 50003 &
    # sleep 50004 &
    
    [2. 해당 프로세스 확인]
    # ps -ef | grep sleep | grep -v grep
    root     14618  1349  0 18:55 pts/1    00:00:00 sleep 50000
    root     14619  1349  0 18:55 pts/1    00:00:00 sleep 50001
    root     14620  1349  0 18:55 pts/1    00:00:00 sleep 50002
    root     14621  1349  0 18:55 pts/1    00:00:00 sleep 50003
    root     14622  1349  0 18:55 pts/1    00:00:00 sleep 50004
    root     14769   791  0 18:56 ?        00:00:00 sleep 60
    root     14800  6438  0 18:56 ?        00:00:00 sleep 10
    
    [3. 해당 프로세스의 PID만 출력]
    # ps -ef | grep sleep | grep -v grep | awk '{print $2}'
    14618
    14619
    14620
    14621
    14622
    14769
    
    [4. backtick을 이용해 kill]
    # kill -9 `ps -ef | grep sleep | grep -v grep | awk '{print $2}'`
    [1]   죽었음               sleep 50000  (wd: ~/awkFile)
    (wd now: ~/server)
    [2]   죽었음               sleep 50001  (wd: ~/awkFile)
    (wd now: ~/server)
    [3]   죽었음               sleep 50002  (wd: ~/awkFile)
    (wd now: ~/server)
    [4]-  죽었음               sleep 50003  (wd: ~/awkFile)
    (wd now: ~/server)
    [5]+  죽었음               sleep 50004  (wd: ~/awkFile)
    (wd now: ~/server)