[네이버클라우드] AIaaS 개발자 과정/Linux

[네이버클라우드캠프] 2023.5.3 Linux(3) - Shell Script - sed, awk

_꼬마돌 2023. 5. 5. 22:32
반응형

Shell Script - sed, awk

sed - stream editor

텍스트 파일에서 특정한 패턴을 찾아 다른 문자열로 치환하거나 삭제, 추가, 출력 등 다양한 작업을 수행하는 유닉스/리눅스 명령어이다. sed는 주로 스크립트 파일을 통해 사용되고, 스크립트 파일은 sed 명령어의 작업을 순차적으로 수행하며, 파일을 수정하거나 출력한다. 

sed는 비대화형(스트리밍) 편집기로서 grep과 비슷하고, ed(대화형 편집기) 에서 왔다.
차이점: 대화형은 입력과 출력이 하나로 이어진다.
sed 명령어는 다음과 같은 기본 형식을 갖는다.

  sed [옵션] '명령어' 파일명

여기서, 명령어는 다음과 같이 작성된다.

  [주소]함수[인자]

=> 주소: 작업을 수행할 행을 선택하는 기능으로, 정규표현식, 숫자, $ 등을 이용한다.
=> 함수: 작업을 수행할 함수로, s, d, p, a, i 등 다양한 함수가 있다.
=> 인자: 함수의 인자. 찾을 패턴, 치환할 문자열, 추가할 텍스트 등이 포함된다.

sed 명령어는 정규표현식을 사용하여 텍스트 파일 내의 패턴을 찾아 수정하는 등 다양한 작업을 수행할 수 있다.
예를 들어, 다음 명령어는 파일 내에서 "apple"을 "orange"로 치환한다.
  
  sed 's/apple/orange/g' filename.txt  => 's' : substitute의 약자. 찾아바꾸기 기능을 나타낸다.
                                       => 'g' : global의 약자. g가 없으면 해당 라인에서 첫 번째로 발견된 문자만 치환됨.
                                                g를 넣어야 해당 라인에서 모든 문자열을 치환한다.
                                       => 'filename.txt'은 sed 명령어의 대상파일이다. 해당 파일에서 apple을 orange로 전부 치환한다.

위 명령어는 's' 라는 "함수"를 사용하고 있다. 'apple'은 찾을 문자열, 'orange'는 대체할 문자열,
'g'는 전체에서 모든 문자열을 대체하라는 옵션이다. 이렇게 구성된 명령어 전체가 's' 함수에 대한 인자로 사용된다.
sed 's/apple/orange/g' filename.txt 명령어는 대상 텍스트 자체를 수정하고 있기 때문에 주소가 없다.


다음 명령어는 주소를 포함하고 있는 sed 명령어이다. 
주소를 사용하면 해당 주소에 해당하는 라인에만 명령어가 적용된다.

  sed '2s/apple/orange/g' filename.txt  => 여기서 '2'가 주소다. 2번째 줄에만 적용된다.
  
'filename.txt' 파일에서 두 번째 줄에 있는 apple을 orange로 바꾸는 명령어이다.

 

sed 명령어에서 자주 사용되는 함수

s   substitute, 대체
d   delete, 삭제
p   print, 출력
a   append, 추가
i   insert, 삽입
c   change, 변경
y   transliterate, 문자 변환
q   quit, 종료

 

다중편집 가능

root@kwc:~# sed -e 's/root/ROOT/g' -e 's/ace/ACEACE/g' filename.txt
=> 'u' 파일 내의 모든 'root' 문자열을 'ROOT'로, 'ace' 문자열을 'ACEACE'로 바꾸는 sed 명령어.
=> -e 옵션은 sed에서 여러 개의 명령어를 사용할 때 각 명령어를 구분하는 역할을 한다.
=> 's/root/ROOT/g' 명령어와 's/ace/ACEACE/g' 명령어 두 개가 함께 사용됨.
=> filename.txt 파일의 내용을 대상으로 명령어를 실행한다는 뜻.

awk

텍스트 데이터를 가공하고 보고서를 작성하는데 유용한 유틸리티 프로그램이다. 
awk는 파일 또는 파이프를 통해 데이터를 입력받아, 패턴 매칭과 액션 규칙에 따라 입력된 데이터를 가공한다.
이때, 액션 규칙은 스크립트 형태로 작성되며, 각 규칙은 패턴과 액션 내용으로 구성된다.
각 규칙은 패턴-액션 형태로 작성되며, 입력된 데이터에서 패턴과 일치하는 부분에 대해 지정된 액션을 수행한다.
패턴과 액션
  awk '[패턴] {action}' "파일명"

예시)
  cat data.txt | awk '{ print $1 }'  

=> data.txt 파일을 cat 명령어를 통해 읽어들인 후, awk 명령어를 사용하여 첫 번째 열의 값만 출력.
=> 중괄호 {} 안에 작성된 내용은 실행할 명령어를 의미.
=> 여기서는 $1 이라는 특수 변수를 사용하여 첫 번째 열을 출력하도록 작성했다. ($2를 넣으면 2번째 열)


예시)
  awk -F: '{ print $6 }' /etc/passwd

=> /etc/passwd 파일에서 각 사용자의 홈 디렉터리 경로를 출력.
=> -F: 옵션은 구분자를 콜론(:)으로 지정하며 $6은 구분자로 구분된 데이터 중에서 6번째 데이터, 즉 사용자의 홈 디렉터리 경로를 의미함.
    -1- -2- -3- -4-  -------------5------------- -----6----- ----7----              
=> white:x:1004:1004:김화이트,501,1234,5678,0000:/home/white:/bin/bash     ':'으로 구분되어있다.
=> 위 명령어를 실행하면 모든 사용자의 홈 디렉터리 경로만 출력된다.


예시)
  awk 'NR==10 {print $0}' data.txt

=> NR==10은 행 번호가 10번째인 것을 나타낸다.
=> {print $0} 은 전체 행을 출력하도록 하는 것.
=> $0 은 전체 행을 의미한다.


예시) 
  awk 'NR==10{print $5}' data.txt

=> NR은 현재 처리중인 레코드(행)의 번호를 나타내는 내장 변수이다.
=> NR==10은 10번째 행을 의미하고 $5는 현재 행에서 5번째 열을 나타낸다.
=> print 함수는 지정된 텍스트 또는 변수를 출력한다.

 

awk 내장 변수

변      수 의      미
FS   필드 구분자
RS   레코드 구분자
NF   필드 수
NR   레코드 수
OFS   출력 시 필드 구분자
ORS   출력 시 레코드 구분자
FILENAME   현재 파일명
FILEDWIDTHS   필드의 폭을 정의한 숫자의 목록으로 빈 칸 구분
ARGC   인수의 수
ARGV   신수의 값, 배열
ARGIND   인수의 index
CONVFMT   번호 변환 방식
ENVIRION   bash 환경 변수의 값을 저장하는 변수
ERRNO   파일 입출력시 시스템 오류 번호
FNR   현재 레코드 번호
IGNORECASE   0이 아닌 값으로 설정하면 대소문자 무시
OFMT   출력할 때 숫자를 문자열로 변환하는 서식 지정자 제어
$0   레코드 전체
$1   첫 번째 필드
$2   두 번째 필드

반응형