-
셸스크립트 - 함수, bc, sed, awkLinux 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 1231.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) = -.41614683654714238699echo 명령어로 실행하고 싶은 계산 식을 표준 출력으로 출력하고 파이프 | 로 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