최근에 고객사마다 환경이 다르기 때문에 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 | [주어진 주소 범위를 출력한다. | |
[주소 범위]/d | delete | [주어진 주소 범위]를 삭제한다. |
s/pattern1/pattern2 | Substitute(바꾸다) | 한 라인에서 처음 나타나는 pattern1을 pattern2로 치환한다. |
[주소 범위]/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번 태그로 저장하였다. 예제에서 lovable은 lover를 치환하기 위한 문자열로 기억된다. |
& | 치호나 문자열로 기억될 수 있는 검색 문자열 저장 | s/tomcat/***&**/ | &는 검색 문자열이므로 tomcat 문자열은 * 문자로 둘러싸인다. Tomcat 문자열은 ***tomcat**로 된다. |
\< | 단어의 시작 | /\<tomcat/ | tomcat으로 시작하는 단어를 포함하고 있는 라인들을 매칭한다. |
\> | 단어의 끝 | /tomcat\>/ | tomcat으로 끝나는 단어를 포함하고 있는 라인들을 매칭한다. |
x\{m\} | X 문자의 반복 횟수 m회 반복 | /o\{5\}/ | o가 5회 반복 |
x\{m, \} | 적어도 m회 반복 | /o\{5,\}/ | o가 적어도 5회 반복 |
x\{m,n\} | m회~n회 사이 반복 | /o\{5,10\}/ | o가 5회에서 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 | 처음 나오는 mariadb를 mysql로 치환하라. S:substitute:바꾸다. |
s/mariadb/mysql/g | 모두 mariadb를 mysql로 치환하라. 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를 이용하여 쉘 스크립트를 만들어 보도록 하겠습니다.
'Linux > Shell script' 카테고리의 다른 글
sed 실전 응용 경로를 바꾸고 싶을 때, file로 저장방법까지 (0) | 2021.09.27 |
---|---|
awk를 이용하여 조건에 맞는 값 출력하기 + | 이용하여 다중 명령 (0) | 2021.09.24 |
linux tomcat 9 컨테이너 분리 shell script (0) | 2021.09.17 |
linux tomcat9 설치 shell script (0) | 2021.09.06 |
linux JAVA 설치 방법 및 Shell script + if문 (2) | 2021.09.03 |
댓글