나의 성장기 보안/코딩$

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의 내용은 패턴 스페이스에 내용이 있을 경우 뒤에 추가하는 명령어이다. 텍스트 맨 뒤로 복사되어 위와같은 효과를 낼 수 있다.

Linux Shell Script(3) - Shell Script 시작하기

Linux Shell Script
@2021-06-30 13:12:12

#!/bin/sh의 의미

  • 셸스크립트 작성시, 첫 라인에 #!를 입력하는 이유는 리눅스의 Shell Script의 첫라인인 "#!"는 스크립트를 실행할 셸을 지정하는 선언문으로 해석되기 때문이다.
  • 따라서 "#!"를 입력한 후 자신이 사용할 셸을 적어주면된다.

 

Linux Shell Script(2) - Linux 셸 (shell)의 종류

Linux Shell Script
@2021-06-30 12:32:38

Linux의 Shell의 개요

  • Linux는 GUI환경도 요즘은 지원이 되지만 이전 환경은 터미널 환경을 이용한(CLI)환경으로 직접 컴퓨터를 운용하였다. 이 CLI환경을 이용할 경우 여러 기능을 제공하기 때문에 많이 사용하고 있으며 이 터미널에 입력한 명령을 해석하고 관리해주는 프로그램을 셸(Shell)이라고 한다.
  • 셸(Shell)은 사용자와 커널 사이에 연결시켜주는 역할을 수행하며 입력한 명령을 해석하여 운영체제가 해당명령을 알아들을 수 있게 해준다.

Shell의 종류

실행 명령 Full name 설명
sh Bourne Shell 벨 연구소의 스티브본이 개발하였으며 많은 셸 스크립트의 기반이 되는 셸이다.
csh C Shell C언어 구문과 유사하며 Bourne Shell을 확장하여 히스토리, 작업제어, 엘리어스 등 기능을 추가하여 개발하였다. 개발자들에게 유용한 기능들을 제공해준다.
tcsh TC Shell C Shell에 명령 행 완성과 명령 행 편집 기능을 추가한 Shell이다.
ksh Korn Shell Bourne Shell가 호환되며 C Shell의 많은 기능을 포함하고 있다, Unix 계열에서 많이 사용한다.
bash Bourne Again Shell (bash) 리눅스에서 가장많이 사용되는 셸로 Bourne 셸을 토대로 C셸과 Korn Shell의 기능들을 통합시켜 개발되었다.

Shell 확인 명령어

grep XXX /etc/passwd명령어

다음과 같이 grep명령어로 해당계정에 대한 정보를 확인할 경우 현재 사용중인 Shell을 알 수 있다.

위의 명령어는 /etc/passwd파일에서 XXX문자열을 사용하고있는 라인을 보여주는 명령어이다.

 


Shell 변경 명령어

1. chsh명령어(System 환경변수 변경)

  • chsh는 "CHange SHell"의 약자로 사용자가 기본으로 사용하는 쉘의 종류, 로그인시에 기본적으로 사용되는 셸의 종류를 변경하고자 할 때 사용하는 명령어이다.
  • 사용하는 셸을 /etc/passwd의 마지막 필드에 저장되어 있으며 이 명령어를 사용하게 되면 마지막 필드가 변경되게 된다.

chsh명령어로 셸을 바꾸는법

2. /etc/passwd의 셸을 변경하는 방법(System 환경변수 변경)

  • /etc/passwd의 셸에 직접 접근하여 System 환경변수를 변경하는 방법

직접 /etc/passwd파일에 접근하여 변경
변경된 셸 확인

3. 1회성 셸변경

  • 그냥 Shell에 원하는 셸을 바꾸면 된다.

일회성 Shell값 변경하기


지원하는 Shell List확인하기

/etc/shells파일 확인

  • /etc 디렉토리는 시스템의 설정파일이 존재하는 디렉토리이며 리눅스 시스템에서 가장 중요한 디렉토리이다.
  • /etc/shells파일에는 현재 OS에서 지원하는 Shell의 종류가 적혀있다.

Linux Shell Script(1) - Notepad++에서 Shell Script작성방법

Linux Shell Script
@2021-06-30 10:28:26

Windows에서 Notepad++를 아무런 처리없이 작성할 경우 다음과 같은 에러가 발생할 수 있다.

./test.sh : line 55: $'\r': Command not found
bash: ./test.sh : /bin/bash^M: bad interpreter: No such file or directory

Windows 운영체제와 Unix 운영체제는 끝줄 처리 방식이 다르기 때문에 발생하는 에러이다.

Windows에서는 \n\r을 사용하여 끝줄을 처리하며, Unix에서는 \n을 사용하고 있기 떄문이다.

 


변경하는 방법은 다음과 같다.

Notepad++

편집 > 줄의 끝문자(EOL) > Unix 형식으로 변환

끝줄 처리 방식 변경

다음과 같이 변경할 경우 Notepad++에서 Unix의 끝줄처리 방식을 사용할 수 있게 된다.

Linux Shell Script (4)

[1]