본문 바로가기
Linux/Shell script

sed 사용법 및 예시

by 개폰지밥 2021. 9. 18.
반응형

최근에 고객사마다 환경이 다르기 때문에 ip주소와 경로를 매번 수정해줘야했는데, window 환경에 notepad++과 같은 tool이 설치 되어있으면 ctrl+f를 이용하여 전체적인 수정이 가능하지만, command line만 사용할 수 있는 환경에서는 sed와 같은 명령어로 치환을 해줘야 했는데, sed 명령어를 사용하다가 아예 쉘 스크립트로 만들기 위하여 이론 공부를 시작했다.

 

※ 김태용의 리눅스 쉘 스크립트 프로그래밍 입문책 참고

1. sed

1.1.  sed?

리눅스에서의 텍스트 처리를 위한 유틸리티로는 대표적으로 sed(stream editor)awk가 있다.

| sed vs awk

- sed: 비대화형 모드의 텍스트 파일 에디터

- awk: C언어 형태의 문법을 가지는 필드 단위의 패턴 처리 언어

sed는 주어진 주소 범위에 대해 입력의 어떤 줄을 처리할 것인지 결정한다. 이때 주소 범위에는 라인 번호 또는 패턴을 사용할 수 있다. 예를 들어 몇 번째 라인의 “tomcat”를 포함하는 모든 라인을 수정할 수 있다.

1-1 : sed 연산자

연산자 이름 의미
[주소 범위]/p Print [주어진 주소 범위를 출력한다.
[주소 범위]/d delete [주어진 주소 범위]를 삭제한다.
s/pattern1/pattern2 Substitute(바꾸다) 한 라인에서 처음 나타나는 pattern1pattern2로 치환한다.
[주소 범위]/s/pattern1/pattern2 Substitute(바꾸다) 주소 범위에 대해서 한 라인에 처음 나타나는 pattern1 pattep2로 치환한다.
[주소 범위]/y/pattern1/pattern2 Transform 주소 범위에 대해서 pattern1에 나타나는 어떤 문자라도 pattern2에 나타나는 문자로 변경한다. (tr과 동일)
G Global 모든 라인에서 입력과 일치하는 패턴에 대해 동작한다.

 

1.2.  sed 도움말 보는 방법

sed –help 또는 man sed 입력

[옵션]

-n: 패턴이 일치하는 라인만 출력

-e: 다음에 나오는 문자열을 편집 명령어로 해석한다. 작은 따옴표(‘’)sed 명령에서 정규표현식용 문자가 쉘에 의해 특수 문자로 재해석되는 것을 방지한다. 이와 같이 함으로써 sed가 명령어의 정규표현식을 확장하도록 해준다.

 

1.3.  sed 동작 원리

sed 스트림 에디터는 한번에 하나의 파일 또는 하나의 입력 으로부터 한 라인만 처리하고 모니터로 출력한다.

이 명령은 vi 에디터에서 사용할 수 있으며, 저장된 라인은 패턴 공간이라고 부르는 임시 버퍼에서 처리한다. 임시 버퍼에 있는 라인의 처리가 한번 끝나면 임시 버퍼에 있는 라인은 모니터로 보내진다. 라인이 처리된 다음 임시 버퍼에서 라인은 제거되고 다음 라인이 임시 버퍼로 읽혀지고 처리되고 출력된다. Sed 입력 파일의 마지막 라인이 처리되었을 때 명령을 종료한다.

 

1.4.  sed 정규표현식 사용

메타문자 의미 예제 설명
^ 라인의 처음 /^tomcat/ tomcat으로 시작하는 모든 라인들
$ 라인의 끝 /tomcat$/ tomcat로 끝나는 모든 라인들
. 하나의 문자 매칭, 하지만 newline 문자는 제외 /t….t/  
* 매칭되는 문자가 없거나 여러 개의 문자열이 될 수 있다. / *tomcat/ 아무것도 없거나 스페이스로 시작하여 linux 문자가 있는 라인들
[] 하나의 문자 매칭 /[Tt]omcat/ Tomcat 또는 tomcat을 포함하는 라인들
[^ ] 하나의 문자도 매칭되지 않음 /[^A-KM-Z]omcat/ Omcat 앞에 A에서 k까지 문자와 M에서 Z까지 문자를 포함하지 않는 라인들
\(.. \) 매칭된 문자들 저장 s/\(love\)able/\1er/ 매칭된 패턴을 나중에 참조하기 위해 \1을 사용하여 1번 태그로 저장하였다. 예제에서 lovablelover를 치환하기 위한 문자열로 기억된다.
& 치호나 문자열로 기억될 수 있는 검색 문자열 저장 s/tomcat/***&**/ &는 검색 문자열이므로 tomcat 문자열은 * 문자로 둘러싸인다. Tomcat 문자열은 ***tomcat**로 된다.
\< 단어의 시작 /\<tomcat/ tomcat으로 시작하는 단어를 포함하고 있는 라인들을 매칭한다.
\> 단어의 끝 /tomcat\>/ tomcat으로 끝나는 단어를 포함하고 있는 라인들을 매칭한다.
x\{m\} X 문자의 반복 횟수 m회 반복 /o\{5\}/ o5회 반복
x\{m, \} 적어도 m회 반복 /o\{5,\}/ o가 적어도 5회 반복
x\{m,n\} m~n회 사이 반복 /o\{5,10\}/ o5회에서 10회 사이 반복

 

1.5.  sed 테스트

vi sedtest.txt

sed -n '/ *was*/p' sedtest.txt

1.6.  sed 예제

sed 예제 의미
8d 8번째 줄 삭제
/^$/d 빈 줄 모두 삭제
1,/^$/d 첫 줄부터 처음 나타나는 빈 줄까지 삭제
/tomcat/p “tomcat’을 포함하는 줄만 출력(-n 옵션 같이 사용) p:print
s/mariadb/mysql 처음 나오는 mariadbmysql로 치환하라. S:substitute:바꾸다.
s/mariadb/mysql/g 모두 mariadbmysql로 치환하라. G:global
s/ *$// 모든 줄의 끝에 나오는 빈 칸을 삭제하라.
s/00*/0/g 연속적인 모든 0을 하나의 0으로 치환하라.
/was/d “was”를 포함하는 모든 줄을 삭제하라.
s/was//g “was”가 나오는 줄에서 “was”만 삭제하라.

 

# port 번호가 있는 부분만 나오게

[fido@localhost conf]$ sed -n '/[p|P]ort/p' server.xml

다음에는 sed를 이용하여 쉘 스크립트를 만들어 보도록 하겠습니다.

반응형

댓글