[리눅스 명령어] sed 사용법

[리눅스 명령어] sed 사용법

안녕하세요? 정리하는 개발자 워니즈 입니다. 이번시간에는 지난번 awk 에 이어서 리눅스 명령어 2편 sed에 대해서 정리해 보도록 하겠습니다.

awk 명령어(1/3)
sed 명령어(2/3)
cut 명령어(2/3)

1. sed 란?

sed는 Stream EDitor의 약자로 매우 컴팩트한 명령 체계를 이용하여 텍스트를 파싱하고 변형하는 (고대의) 텍스트 편집 도구이다. sed는 그 전신이 되는 ed의 스크립팅 체계를 기반으로 하고 있다. vim과 같이 편집될 텍스트를 화면상에 보면서 내용을 작성/수정하는 개념의 텍스트 편집기가 개발되기 이전의 텍스트 편집기이다.

일반적으로 에디터로 텍스트를 조작하려 할 때, 사람들이 주로 하는 방식은 다음과 같을 것입니다.

  1. 에디터를 켭니다.
  2. 편집할 텍스트파일을 다.
  3. 편집할 위치로 커서를 이동합니다.
  4. 내용을 수정합니다.
  5. 파일을 저장합니다.
  6. 에디터를 닫습니다.

그런데, 위의 과정을 SED로 진행하기 위해서는 다음이 필요합니다.

  • 텍스트 내용을 완벽히 알고 있어야한다.
  • 어느라인 혹은 어떤 내용을 수정할지 알고있어야 한다.
  • 스크립트를 활용해서 해당 라인을 수정한다.

2. sed 명령어 사용법

  • 기본
$ sed [옵션] 스크립트 입력파일1 [입력파일2 ... ]
  • 옵션
옵션/스위치 별칭 기능
-n –quiet, –silent 읽어들인 라인을 암시적으로 자동출력하는 것을 중단한다.
-e –expression=script 실행될 명령에 스크립트를 추가한다
-f script_file –file=script_file 스크립트 파일의 내용을 가져와서 추가로 실행한다.
–follow-symlinks 제자리 처리시에 심볼릭 링크를 따르도록 한다. 하드링크는 깨진다.
-i[SUFFIX] –in-place[=SUFFIX] 파일을 제자리 처리한다. (즉 변경된 내용을 파일에 적용한다.)
-c 제자리 처리시에 사본을 이용한다.
-l N –copy 한줄의 길이를 정의한다.
–line-length=N 모든 GNU확장을 제외한다.–line-length=N
-r –posix 확장된 정규식 패턴을 사용한다.
-s –regexp-extended 파일을 하나의 긴 스트림이 아닌 분리된 데이터들로 처리한다.
-u –separate 입력으로부터 최소한의 내용만 읽고 더 자주 플러시한다.
도움말을 표시한다.

필자가 상위의 내용을 정리해두었지만, 사실 필자도 주로 사용하는 옵션은 -n,-e 정도 입니다. sed를 주로 치환용도로 많이 사용하다보니, 활용법을 잘 몰랐습니다.

이번 포스팅에 대한 정리를 sed에 대해서 심도 깊게 할 수 도있지만, 주로 활용법위주로 많이 해두어야 개발자 분들이 많이 가져다가 사용할 것 같습니다. 그래서 예시로 정리하겠습니다.

  • f 옵션도 자주 사용하는 것 같아서 정리합니다.

sed명령어의 -f(file)선택자를 사용하면 명령어를 일일이 키보드에서 입력하지 않고 하나의 파일에 기억시켜 놓고 사용할 수도 있다.

 # sed -f command.file in.file

여러 개의 명령어를 연속적으로 자주 사용할 때 이 명령어 파일이 유용하게 사용된다.
예를 들어 다음과 같은 복수 개의 명령어가 파일에 기억되어 있는 경우는

 # vi command.file
   s/hello/goodbye
   s/good/bad

다음과 같은 명령어를 입력하면 다음과 같이 출력된다.

 # echo "1234hello5678" | sed -f command.file
   => 1234badbye5678
  1. 치환
sed 's/addrass/address/' list.txt : addrass를 address로 바꾼다. 단, 원본파일을 바꾸지 않고 표준출력만 한다.
sed 's/\t/\ /' list.txt : 탭문자를 엔터로 변환

  1. 삭제
sed '/TD/d' 1.html : TD 문자가 포함된 줄을 삭제하여 출력한다.
sed '/Src/!d' 1.html : Src 문자가 있는 줄만 지우지 않는다.
sed '1,2d' 1.html : 처음 1줄, 2줄을 지운다.
sed '/^$/d 1.html : 공백라인을 삭제하는 명령이다. (★★★)

3. sed 예시

  • 치환 예시
#특정 문자열 바꾸기
sed 's/hello/goodbye/' tempfile.txt

#특정 문자열이 포함된 행에서 특정 문자만 제거 하기
sed 's/hello//g' tempfile.txt

#파일의 일부만 편집해야 할 경우 라인의 범위를 지정하여 사용가능
sed '3,7s/hello//g' tempfile.txt

#라인 번호 대신 문맥을 범위로 지정한 경우
sed '/hello/,/goodbye/s/bad/good' tmepfile.txt
sed '/hello/,/goodbye/s/bad/good/g' tmepfile.txt

#특정라인의 문자 치환
sed -n '5s/hello/####/g' tmepfile.txt
  • 삭제 예시
#특정 문자열 포함한 라인 제거
sed 's/hello/d' tempfile.txt

#3번째 라인을 삭제 
sed '3d' tempfile.txt

#princess 또는 Princess를 포함하고 있는 라인들을 삭제함
sed '/[hH]ello/d' tempfile.txt

#라인 1부터 hello를 포함하고 있는 첫번째 라인까지 모든 라인을 삭제함
sed '1,/hello/d' tempfile.txt

#tempfile.xtxt 안의 데이터로부터 처음 세 개의 문자열을 삭제함
sed 's/...//' tempfile.txt

#tempfile.xtxt 안의 데이터로부터 마지막 세 개의 문자열을 삭제함
sed 's/...$//' tempfile.txt

#모든 공백라인 제거
sed '^$/d' tempfile.txt

#여기서부터는 실제 cli창에 테스트 해보세요!
#각 라인의 첫번째 공백에서 마지막까지 삭제함
who | sed 's/ .*$//'

#각 라인의 처음부터 맨 마지막 공백까지 삭제
who | sed 's/^.*$//'

#각 라인의 처음부터 : 문자가 있는 곳(:문자포함)까지 삭제
who | sed 's/^.*://'
  • 입/출력 예시
#각 라인마다 뒤에 Hello World! 문자를 입력
sed 'a\\Hello World\!' tempfile.txt

#3번째라인 뒤에 Good Morning 문자 삽입
sed '3a\\Good Morning' tempfile.txt

#각 라인마다 공백라인 추가
sed 'a\\' tempfile.txt

#hello 문자가 들어있는 line만 프린트
sed -n '/hello/p' tempfile.txt

#hello 문자가 들어있는 라인 중복 출력?
sed '/hello/p' tempfile.txt
  • 필자가 사용했던 예시
#리눅스 서버에서 password 관련 셋팅 치환
sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config
sed -i "s/#system/#team-system/g" *.location  

#자빅스 처음 셋팅할때 php 파일 설정들 치환
sudo sed -i 's/^max_execution_time.*/max_execution_time=600/' /etc/php.ini
sudo sed -i 's/^max_input_time.*/max_input_time=600/' /etc/php.ini
sudo sed -i 's/^memory_limit.*/memory_limit=256M/' /etc/php.ini
sudo sed -i 's/^post_max_size.*/post_max_size=32M/' /etc/php.ini
sudo sed -i 's/^upload_max_filesize.*/upload_max_filesize=16M/' /etc/php.ini
sudo sed -i "s/^\;date.timezone.*/date.timezone=\'Asia\/Tokyo\'/" /etc/php.ini

#현재 폴더에서 특정문자열 치환
find ./ -type f -name "*" -exec sed -i 's/io.honeymon/kakaopay.com/g' {} \;

#로그파일에서 특정 문자열을 찾은뒤, 공백라인 제거
zcat replication.log.2018-11-21.gz | grep '/sk/feature' |grep qa_pub_a01 | awk '{print $9}' | sed '/^$/d'

4. 마치며

sed는 흔히 s///를 써서 특정한 파일이나 명령의 출력에서 특정 문자열을 치환하는 명령어로만 알았습니다. 하지만, sed 역시 편집기로 분류됩니다. 리눅스에서 아시다시피, 편집기하면 제일먼저 떠오르는것은 vim 입니다. 하지만, 그 이전 시대에는 sed를 많이 활용했던것 같습니다. 확실히 sed는 치환,삭제 등 라인의 변경에 대해서 유용하게 사용할 수 있을 것 같습니다.

-i 옵션을 사용하지 않는 이상 원본 파일에 되쓰는 일은 없습니다.
sed는 기본적으로 처리된 결과를 출력하는 일을 수행하며, 그 결과를 파일로 만들기 위해서는 주로 리다이렉션을 사용한다.

다음시간에는 cut 에 대해서 알아보는 시간을 갖도록 하겠습니다.

워니즈 블로그
워니즈 깃헙

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다