나의 성장기 보안/코딩$

Linux Shell Script(4) - SED(Stream Editor) 명령어

Linux Shell Script
@2021-07-01 11:36:26

SED(Stream Editor) 명령어

  • sed명령어는 원본 텍스트 파일을 편집하는 유용한 명령어이다. vi편집기와 유사하다.
  • sed와 vi편집기의 다른 점은 sed는 명령어 형태로 편집이 가능하며 vi처럼 편집기를 열어서 서로 소통하듯 수정/변경을 해나가는 대화형 방식이 아니다.
  • sed는 명령행에서 파일을 인자로 받아 명령어를 통하여 작업한 후 결과를 화면으로 확인하는 방식이다. 즉 편집기를 명령어 쓰듯 사용하는 방식을 말한다.
  • 즉, 원본은 건드리지 않고 편집하기 때문에 작업이 완료되면 원본에는 전혀 영향이 없다는 점이다. 만일 해당 명령어를 사용하게 되면 내부적으로 특수한 저장 공간인 Buffer를 사용한다.
  • Sed명령어는 Streamlined editor를 의미한다. Streamlined는 '능률적인'을 의미한다.
  • Buffer에는 2가지 종류가 존재한다.
    1. Partten Buffer : 패턴 스페이스라고도 한다.
    2. Hold Buffer : 홀드 스페이스라고도 한다.
  • sed옵션에서 -i 옵션을 사용할 경우 원본을 바꿀수 있게 된다.

Hold, Parttern Space

패턴 버퍼(스페이스)

  • sed가 파일을 라인단위로 읽을 때 그 읽은 라인이 저장되는 임시 공간이다.
  • 만일 sed명령어로 출력하라고 지시할 경우 이 Parttern Space의 내용을 출력하는 것이고, 만일 조작을 한다면 Parttern Space의 내용을 조작하는 것이다.
  • 원본의 데이터를 불러들여 Parttern Space에 저장을 하고 원본의 데이터를 건들지 않고 이 Parttern Space의 내용을 변경하여 출력하게 된다.

홀드 버퍼(스페이스)

  • Hold Space는 Parttern Space처럼 짧은 순간 임시 버퍼를 저장하는것이 아닌 길게 저장하고 있는 저장소이다. 전에 작업하였던 라인을 기억하고 있을 수 있다.
  • 어떠한 내용을 Hold Space에 저장하면, sed가 다음 행을 읽더라도 사용자가 원할 때 불러와서 재사용할 수 있는 버퍼를 Hold Space라고 한다.

SED의 옵션

1. sed -n 옵션

특정 범위만큼 출력하기

  • sed -n '1p' XXX : XXX파일에서 첫 번째 행만 출력하여 화면에 보여준다.
  • sed -n '1, 3p' XXX : XXX파일에서 1~3Line 범위의 내용을 출력하여 보여준다.
  • sed -n '8, $p' XXX : XXX파일에서 8Line~마지막Line까지의 범위의 내용을 출력하여 보여준다.
-n n옵션은 sed의 parttern Space에 있는 내용을 출력한다.
p P는 Print의 약자로 ,(컴마)를 이용하여 범위를 지정할 수 있다.

2. sed -e옵션

-e 여러개의 편집 명령을 실행시킬 때 -e 옵션을 쓴다.
  • 서로 떨어져 있는 데이터를 sed명령어로 출력하기 위해서는 다음과 같이 사용하면 된다.
    sed -n -e '1p' -e '45,$p' XXX

sed -e옵션

3. 특정 단어로 시작하는 행들 추출하기

특정 문자열 추출

  • 특정 문자열을 추출하기 위해서는 "/원하는 문자열/"를 입력해주면 된다.
  • 특정 문자열로 시작하는 단어를 추출하기 위해서는 다음과 같이 입력하면 된다 "/^원하는 문자열/"
  • 여기서  ^는 메타문자로 "시작"을 의미한다.

4. 파일에서 공백 및 빈줄 제거하기

sed 명령으로 빈 Line 제거하기

  • 메타문자 ^(시작), $(끝)을 알리는 문자로 행의처음과 행의끝을 의미한다.
  • d옵션은 delete의 약자로 삭제를 의미한다.
  • 위의 문자를 해석하면 행의 처음과 행의 끝에서 빈 Line들을 지우고 내용을 출력해주라는 것을 의미한다.

빈 Line제거 후 새파일로 저장하기

  • 위의 명령어를 수행하게 되면 빈 Line을 제거하고 Redirection으로 test02라는 파일로 저장하라는 것을 의미한다.

*메타문자의 의미

  • *는 메타문자로 앞의 문자를 0개 이상 찾는다.
  • 행의 시작이 0개 이상의 공백으로 이뤄지다 끝을 맺는것이기 때문에 공백이거나 빈 Line을 찾아낸다는 의미한다.

5. 단어 치환

 s와 g의 의미

  • 파일의 특정 문자열을 원하는 문자로 치환하기 위해서는 s 플래그를 사용하면 된다. s는 Substitution으로 치환을 의미한다.
  • g 플래그는 치환이 행에서 전체를 대상으로 이루어진다는 것을 의미한다. sed명령어는 Line단위로 이루어지기 때문에 g플래그를 사용할 경우 전체 Line에 대해서 수행한다는 것을 의미한다.
  • 위의 명령어는 파일의 전체에서 "sed"로 시작하는 문자열을 "substitution" 문자열으로 변경시킨다는 것을 의미한다.

대소문자 구분없이 사용 플래그 i

  • 위에서는 sed로 시작하는 문자열을 Substitution으로 치환한 후 test02파일에 저장했다.
  • i플래그를 사용하여 소문자 substitution으로 시작하는 문자열을 찾았지만 test02파일에는 대문자로 저장되어 있다.
  • 이 구분을 무시하기 위해서 i플래그를 사용하여 해당 문자열을 검색 후 sed문자열로 변경하는 사진이다.
  • 즉 i플래그는 변경 대상 단어를 찾을 때 대소문자를 무시한다는 플래그이다.

6. SED의 나머지 명령어

나머지 명령어 내용
a\ 현재 행에 하나 이상의 새로운 행을 추가한다.
c\ 현재 행의 내용을 새로운 내용으로 교체한다.
d 행을 삭제한다.
i\ 현재 행의 위에 텍스트를 삽입한다.
h Parttern Space의 내용을 Hold Space에 복사한다.
H Parttern Space의 내용을 Hold Space에 추가한다.
g Hold Space의 내용을 Parttern Space에 복사한다. (패턴 스페이스가 비어있지 않은 경우에는 덮어쓰기)
G Hold Space의 내용을 Parttern Space에 복사한다. (패턴 스페이스가 비어있지 않을 경우 그 뒤에 추가)
I 출력되지 않는 특수문자를 명확하게 출력한다.
p 행을 출력한다.
n 다음 입력 행을 첫 번째 명령어가 아닌 다음 명령어에서 처리하게 한다.
q sed를 종료한다.
r 파일로부터 행을 읽어온다.
! 선택된 행을 제외한 나머지 전체 행에 명령어를 적용한다.
s 문자열을 치환한다.

6-1. sed의 s옵션과 같이 쓰이는 치환 플래그

S와 쓰이는 플래그 내용
g 치환이 행 전체에 대해서 이루어진다.
p 행을 출력한다.
w 파일에 쓴다.
x Hold Space와 Parttern Space의 내용을 서로 맞바꾼다.
y 한 문자를 다른 문자로 변환한다. 하지만 메타문자를 사용할 순 없음.

기타

다픈파일로부터 읽어서 추가하는 명령어(r)

r명령어로 특정 파일의 내용 추가하는 방법

  • 위 sed '/Hello/r addfile' test03이라는 명령어는 다음과 같이 해석할 수 있다.
  • test03파일에서 Hello라는 특정 문자열을 찾아 읽은 후 addfile이라는 파일에 있는 Line을 삽입하라.
  • 따라서 해당 명령어 수행시 Hello Line뒤에 addfile의 내용이 추가된 것을 확인할 수 있다.

다른 파일에다가 쓰는 명령어(w)

파일의 특정 내용을 다른파일에 쓰기

  • 위의 sed -n '/Hello/w test02' test01이라는 명령어는 다음과 같이 해석할 수 있다.
  • test01의 Hello로 시작하는 Line을 읽어서 해당 라인을 test02라는 파일로 저장하라

수정할 파일에 내용 추가하기 명령어(a\)

\a로 특정 문자열 담긴 Line추가하기

  • ^시작문자열이 Hello로 시작하는 Line을 찾아서 a\명령어를 사용하여 특정문자열을 추가하는 명령어

Parttern Space 및 Hold Space 활용하기

sed의 Hold Space 및 Parttern Space 활용하기

  • 위의 명령어는 test02파일에서 Hello라는 단어를 찾은 후 그 Line을 Hold Space에 저장한다.(h명령어를 통하여)
  • 그 후 $는 마지막행을 의미하며 마지막행에 Hold Space의 내용을 Parttern Space에 복사한다. 대문자G의 내용은 패턴 스페이스에 내용이 있을 경우 뒤에 추가하는 명령어이다. 텍스트 맨 뒤로 복사되어 위와같은 효과를 낼 수 있다.