[ Bash Shell ] sed 명령어
본문 바로가기
OS/Linux

[ Bash Shell ] sed 명령어

by 코딩하는 핑가 2021. 4. 8.
반응형

* 이 포스팅은 썬구루님의 포스팅을 정리한 글입니다.

* 오탈자 혹은 잘못된 정보가 있다면 댓글달아주세요.

* 2차가공 및 재배포를 금지합니다.

* ctrl + f로 원하는 옵션을 빠르게 검색해보세요.

* 출처 : blog.naver.com/PostList.nhn?blogId=sunguru

 

1. sed 명령어

대게 텍스트 파일의 내용을 보거나 수정할 때는 head, tail, more, less, cat과 같은 명령어를 사용하고, 특정 패턴이나 문자열에 정합되는 부분을 추출하기 위해서는 grep, egrep, fgrep을 사용한다.

 

위의 명령어들을 이용하여 텍스트 파일의 내용을 보거나 필터링할 수 있는데 그렇다면, 텍스트 파일을 수정하기 위해서는 어떤 명령어들을 써야할까?

 

대부분의 사용자들은 다루기 쉬운 vi 편집기를 이용해 텍스트 파일을 수정할 것이다.

 

vi를 사용하는 것이 당연한 방법이지만, 만약 용량이 매우 큰 텍스트 파일 내용 중 특정 줄을 출력하거나 여러 파일들의 내용을 수정해야 할 경우가 생겼을 때 vi 편집기만 이용한다면 굉장히 힘들고 작업 시간이 오래걸릴 것이다.

 

이를 개선하기 위해 sed 명령어를 사용한다.

 

sed 명령어는 비상호대화형 스트림 편집기로

 

1. 특정 줄을 출력할 때

- sed -n '10,12'p file_name

 

2. 패턴에 일치하는 줄을 출력하고자 할 때

- sed -n '/^test=/'p file_name

 

3. 패턴에 일치하는 내용을 변경하고자 할 때

- sed -i 's/test=enforcing/test=permissive/' file_name
- sed -n '/^test=/'p file_name

 

사용할 수 있으며 실행할 명령들을 파일로부터 받아들여 처리할 수 있다.

 

* sed 명령 형식

sed [option] 'instructions' filename

 

* 옵션

-n : 입력줄 자동 출력을 제한하기 위해 사용

-e : 하나 이상의 지시어를 사용할 경우 사용

-i : 직접적 파일 편집을 위해 사용

-f : sed 지시어 스크립트 파일을 사용하기 위해 사용

 

* sed 명령어 사용 예

패턴(Pattern)을 / 기호로 감싸고 쉘의 정규 표현식으로 처리되는 것을 막기 위해 단일 부호로 감싼다.

출력(Print)를 나타내는 명령 p를 같이 사용

sed 명령은 입력줄을 자동으로 출력하기 때문에 자동 출력 억제를 위해 -n 옵션을 사용

# sed -n '/SELINUX=/'p file_name
# SELINUX= can take one of these three values:
SELINUX=enforcing

# sed -n '/^SELINUX=/'p file_name

SELINUX=enforcing

■ 출력 (계속)

파일의 특정 줄을 출력하려 할 때 줄 번호 또는 줄을 나타내는 심벌을 사용할 수 있습니다. 1은 첫 번째 줄을 뜻하고 $는 마지막 줄을 뜻하죠. sed 명령을 사용하여 selinux  파일의 7번째 줄을 출력하기 위해 아래와 같이 명령을 사용할 수 있죠.

# sed -n '7p' /etc/sysconfig/selinux
SELINUX=enforcing

그럼 여러 줄의 범위를 출력해야 할 경우 어떻게 해야 할까요? 여러 지시어를 한 번에 사용하면 됩니다. 지시어의 구분자는 세미콜론(;)을 사용하죠.

# sed -n '2p;5,6p;9p' /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#     targeted - Targeted processes are protected,

삭제

삭제는 간단합니다. p (Print) 명령 대신 d (Delete) 명령을 사용하고 -n 옵션은 사용하지 않으면 됩니다.  -n은 입력줄 자동 출력 방지이지만 삭제는 삭제 줄을 제외한 나머지 입력줄이 출력되어야 하기 때문이죠

. 예를 하나 들어보죠. enforcing과 빈 줄을 포함하고 있는 줄을 제거해보도록 하죠.

# sed '/enforcing/d;/^$/d' /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     disabled - No SELinux policy is loaded.
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

그리고 출력값을 입력값으로 받아 빈 줄 삭제를 처리하고 싶다면 아래와 같이 명령을 실행할 수 있죠.

# sed '7,10d' /etc/sysconfig/selinux | sed '/^$/d' -
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUXTYPE=targeted 

어떻게 명령이 처리되는지 대충 감이 오죠? 다음 게시물에선 치환에 대해 알아보도록 하죠.

 

 

* 치환 

'[줄 범위]s/패턴/변경값/플래그'

 

줄 전체에 적용하기 위해 플래그 위치에 g를 사용하면 됩니다. g는 global을 의미합니다.

# sed 's/cat/lion/g' 1.txt
lion tiger lion

 

sed '줄번호 명령\문자열' 파일명
sed '/패턴/ 명령\문자열' 파일명

반응형

댓글