ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 셸스크립트 - 함수, bc, sed, awk
    Linux 2022. 12. 25. 00:27

    함수, bc, sed, awk 사용법을 알아본다.


    1. 함수 

    #!/bin/bash
    
    my_func() {
    	echo $1 + $2 = `expr $1 + $2`
    }
    
    a=10
    b=2
    func $a $b

    함수명() { 내용 } 

    func 에 인수를 전달하여 $1, $2 과 같은 방법으로 전달 받을 수 있다.

     

    셸 스크립트에선 일반적으로 사용되는 프로그래밍 언어에서의 return 개념이 없다.

     

    결과 값을 전달 받는 방법으로 3가지 정도가 있는데 다음과 같다.

    1.1 echo string

    func() {
        test=123
        echo "result is ${test}"
    }
    
    res=$(func)
    
    echo $res
    
    --- 실행 화면 ---
    
    result is 123

     

    1.2 return exit status

     

    func() {
        return 100
    }
    
    func
    res=$?
    echo $res
    
    --- 실행 화면 ---
    
    100

    셸 스크립트에서 return 을 사용하게 되면 상태 종료값을 남길 수 있다.  (정수 0~255만 전달 가능하다. 0은 성공을 의미)

    $? : 직전에 실행한 명령어 상태, 를 사용해 전달 받을 수 있다.

     

    1.3 share variable

    res=""
    
    func() {
        test=123
        res="result is ${test}"
    }
    
    echo $res
    
    --- 실행 화면 ---
    
    result is 123

    전역 변수를 선언하고 해당 변수에 값 할당한다.

     

     

    2. bc

    expr으로는 소수점 계산 불가능 하므로 bc를 대신 사용한다. 

    #!/bin/bash
    
    a=3.0
    b=1.5
    
    echo $a '*' $b = `echo "scale=5; $a*$b" | bc`
    echo $a / $b = `echo "scale=5; $a/$b" | bc`
    
    
    c=2.0
    echo "sin($c)" = `echo "s($c)" | bc -l`
    echo "cos($c)" = `echo "c($c)" | bc -l`
    
    -- 실행 화면 ---
    
    3.0 * 1.5 = 6.75
    3.0 / 1.5 = 2.00000
    sin(2.0) = .90929742682568169539
    cos(2.0) = -.41614683654714238699

    echo 명령어로 실행하고 싶은 계산 식을 표준 출력으로 출력하고 파이프 | 로 bc 명령어에 넘긴다.

    scale=5 라고 설정하면 소수점 이하 5자리까지 계산하게 된다.

    더 복잡한 계산을 하려면 -l 옵션을 지정해서 사용한다.

     

    2.1 주요 옵션

    s(expr) - 사인

    c(expr) - 코사인

    l(expr) - 자연로그

    e(expr) - 지수 함수

     

     

    3. sed

    문자열 처리 시 유용하다.

     

    3.1 주요 옵션

    -f script_file : script_file 스크립트 파일을 읽어서 처리한다.

    -e command : command 처리를 실행한다.

     

    3.2 주요 내부 명령어

    옵션의 command에 올 수 있는 명령어

    p : 화면에 출력한다.

    d : 삭제한다.

    = : 줄 번호를 표시한다.

    a\(enter)test 또는 a text : text 텍스트를 다음 줄에 추가한다.

    i\(enter)text 또는 i text : text 텍스트를 이전 줄에 삽입한다.

    c\(enter)text 또는 c text : text 텏트로 치환한다.

    s/old/new : old 패턴을 new 패턴으로 치환한다.

     

    #!/bin/bash
    
    while [ $# -gt 0 ]; do
        src=$1
        shift
        
        dst=`echo $src | sed -e "s/\.jpeg$/\.jpg/"`
        if [ $src = $dst ]; then
        	continue
        fi
        echo rename $src to $dst
        mv $src $dst
    done

    인수로 지정한 파일의 jpeg 확장자를 jpg 확장자로 변경하는 스크립트이다.

    #$ 으로 인수 개수를 확인하고 shift로 인수를 당기며 반복한다.

    sed command 에는 old 패턴 (.jpeg) 을 new 패턴(.jpg) 으로 치환하는 명령어를 의미한다.

    mv 명령어로 파일명을 변경한다.

    #!/bin/bash
    
    while [ $# -gt 0 ]; do
        src=$1
        shift
        
        name=${src%.*}
        ext=${src##*.}
        dst=$name.jpg
        if [ $ext = jpeg ]; then
        	echo rename $src to $dst
        	mv $src $dst
        fi
    done

    셸 내장 문자열 조작 기능을 통해서 더 간단하게 바꿀 수 있다.

    ${src%.*} 으로 src 문자열 뒤에서부터 .*과 일치하는 가장 짧은 문자열을 삭제하면 확장자를 제거한 문자열이 된다.

    ${src##*.} 으로 문자열 앞에서부터 *. 패턴과 일치하는 가장 긴 문자열을 삭제하여 확장자만 남긴다.

    arc.tar.gz 처럼 .을 여러개 포함하더라도 가장 긴 문자열이 삭제하기 때문에 gz 확장자만 남게 된다.

     

    셸 내장 문자열 조작 기능

    ${var#pat} : var 변숫값에서 전방 일치로 pat 패턴과 일치하는 가장 짧은 문자열 삭제

    ${var##pat} : var 변숫값에서 전방 일치로 pat 패턴과 일치하는 가장 긴 문자열 삭제

    ${var%pat} : var 변숫값에서 후방 일치로 pat 패턴과 일치하는 가장 짧은 문자열 삭제

    ${var%%pat} : var 변숫값에서 후방 일치로 pat 패턴과 일치하는 가장 긴 문자열 삭제

     

     

    4. awk

    문자열 추출 시에 유용하다.

     

    4.1 주요 옵션

    -F fs : 필드 구분자를 정규 표현식 fs로 설정한다.

    -f progfile : 스크립트 파일 progfile을 읽어서 처리한다.

     

    4.2 처리

    pattern {action} : 레코드 (기본값은 입력 행)가 조건식 pattern을 만족할 때 액션 action 을 실행한다. 액션을 생략하면 레코드를 표시한다.

     

    4.3 주요 조건식(pattern)

    /regexp/ : 정규 표현식 pattern과 일치하는 레코드에 액션 action을 실행한다.

    BEGIN : 첫 레코드를 읽기 전에 액션 action을 실행한다.

    END : 마지막 레코드를 읽은 후에 액션 action을 실행한다.

     

    4.4 액션

    조건식과 일치하는 레코드에서 실행할 처리를 지정한다.

    액션은 여러 구문으로 이뤄지며 문장 사이는 ; 또는 줄 바꿈으로 구분한다.

     

    4.5 문장(statement)

    expr : expr 식을 평가한다.

    print [expr..] : expr 식을 표시한다.

     

    4.6 표현식(expr)

    숫자나 문자열 외에도 변수, 사칙연산을 비롯한 계산 (+, -, += , ++ , /=  등), 비교 연산자 (==, >  등), 논리 연산자 (!, ||, &&) 을 사용한다.

     

    4.7 내장 변수

    필드와 레코드 처리 방법을 제어한다.

    $0 : 레코드 (입력한 행) 전체

    $n : n번째 필드

    FS : 필드 구분자, 디폴트는 공백 문자

    NF : 필드 개수

    RS : 입력 레코드 구분자. 디폴트는 줄 바꿈

    NR : 레코드 번호. 디폴트는 줄 번호

    OFMT : 숫자 출력 형식

    OFS : 출력 필드 구분자

    ORS : 출력 레코드 구분자.

     

     

    ls -l | awk '{print $9 " " $5}'

    -> ls -l 의 표준 출력을 awk 명령어로 넘겨 내부 명령어 print 로 9번째 필드, 공백 문자, 5번째 필드를 표시한다.

     

    이처럼 형식이 정해진 텍스트를 줄(레코드)마다 처리해서 필요한 부분만 추출하는 작업을 awk로 간단하게 처리할 수 있다.

     

    csv 파일에서도 추출이 가능하다.

     

    M,172,68

    F,154,42

    F,162,53

    M,168,72

     

    위와 같은 data.csv 파일이 있다고 하자.

    두 번째 필드만 표시하고 싶다면 -F옵션을 사용하고 필드 구분자를 ,(콤마)로 지정한 후 내부 변수 $2로 두 번째 필드 값을 선택하여 표시한다.

    -> awk -F, '{print $2}' data.csv

     

     

    'Linux' 카테고리의 다른 글

    dig, nslookup  (2) 2023.01.01
    traceroute(tracepath)  (0) 2022.12.31
    셸스크립트- for, seq, while, expr, getopts  (0) 2022.12.24
    셸스크립트 - $, if, case, [, test  (0) 2022.12.24
    echo, unset  (0) 2022.12.24
Designed by Tistory.