운영체제/리눅스

[리눅스] 쉘스크립트_2(awk,sed)

Cloud_Park 2022. 7. 31. 12:24

2022.07.11 - [운영체제/리눅스] - [리눅스] GCC 입문

2022.07.13 - [운영체제/리눅스] - [리눅스] GDB 디버거 _1

2022.07.24 - [운영체제/리눅스] - [리눅스] GDB디버거_2

2022.07.24 - [운영체제/리눅스] - [리눅스] Make 및 Makefile

2022.07.31 - [운영체제/리눅스] - [리눅스] 쉘스크립트_1

awk(오크)

오크는 유닉스에서 처음 개발된 일반 스크립트 언어,awk 기본 기능은 텍스트 형태로 되어 있는 입력 데이터를 행과 단어 별로 처리해 출력하는 것

명령의 수행결과나 파일의 데이터 내용을 한줄로 읽어 들여, 한줄의 내용을 단어로 끊어서 읽어 들이고 이를 조작 및 연산에 활용

 

 

실행

awk '페턴 {동작} 패턴{동작}' 파일명
command | awk '패턴{동작} 패턴{동작}'
awk -f awk파일명 파일명

BEGIN {동작} #입력을 읽기 전에 주어진 '동작'을 먼저 실행한다.
END {동작} #위와 비슷하다 입력을 모두 훑고 마지막에 주어진 동작을 실행한다.

/페턴/ # '패턴'에 일치하는 줄을 출력한다.
{동작} # 매 줄을 읽을 때마다 '동작'을 실행한다.

print는 텍스트를 출력한다.

주요 키워드
FILENAME - 입력된 파일이름
NR - 현재 행의 번호
NF - 현재 행의 단어의 개수
FS - 입력 단어 분리자
OFS - 출력 단어 분리자

 

 

실습 예제

파일네임 : information.txt

1,Lee,02-123-123,010-1232-3233,Seo
2,Kim,051-123-123,010-4223-1111,Inchon
3,Park,031-1231-123,010-1111-2222,Daegu
#!/bin/bash
/bin/awk \
'BEGIN {FS= ","; print "address book"\
	{idx=$1}{name=$2}{phone=$3}{mobile=$4}{city=$5}\
	{n+=1} \
	{print"<("idx")" name">"}\
	{print" Phone Number:" phone}\
	{print" Mobile Number: " mobile}\
	{print" City: " city}\
END{print"TOTAL:" n" address."}' information.txt



======
aws -F, 'print $2 "\t" $4' information.txt



======카운팅하기
awk '{++cnt}' END {print"Count=", cnt}' information.txt

 

 

실습2

/etc/passwd

 

###FS는 구분자 지정

#!/bin/bash
/bin/awk \
'BEGIN {FS=":"}\
	{print $1 "home at" $6 }'\
/etc/passwd

===== -F: -> : 가 구분자
awk -F:'{print $1 "home at " $6}' /etc/passwd

 

 

 

 

sed

sed는 stream editer의 준말 대상에 대한 내용을 원하는 폼으로 변경이 목적

사용법

sed 's/regexp/replacement/g' inputFileName > outputFileName
regexp퍄턴을 찾아 replacement로 치환한 후 outputfile로 쓴다

===
필터
generateDate |sed 's/x/y/g'
generateDate로 수행한 데이터를 만든 다음 x-> y변경

===
echo xyz xyz |sed 's/x/y/g' 
yyz yyz


=== -f 조건문파일 가져오기
sed -f subst.sed inputFileName > outputFileName

 

 

sed 's/won/woo/g' informagion.txt ## g는 전부 변경
sed 's/031/02/1' informaion.txt ## 첫번째만 변경
sed '2d' information.txt ##2번째 줄 삭제
sed '/Won/d' information.txt ## Won있는 줄삭제
sed'2i/2,New,00-000-0000,000-000-0000,korea' informaion.txt ## 2번째줄에 추가

키워드

sed 's/won/woo/g' informagion.txt ## g는 전부 변경
sed 's/031/02/1' informaion.txt ## 첫번째만 변경
sed '2d' information.txt ##2번째 줄 삭제
sed '/Won/d' information.txt ## Won있는 줄삭제
sed'2i/2,New,00-000-0000,000-000-0000,korea' informaion.txt ## 2번째줄에 추가

 

cat /proc/memoinfo

======
#!/bin/bash
total='cat /proc/memoinfo | grep MemTotal | /bin/awk 'print $2''
free='cat /proc/memoinfo |grep MemFree | /bin/aws 'print $2''
use='expr $total-$free'
echo "Mem Usage: $((use*100/total))%"