[리눅스 명령어] sed 사용법
[리눅스 명령어] sed 사용법
안녕하세요? 정리하는 개발자 워니즈 입니다. 이번시간에는 지난번 awk 에 이어서 리눅스 명령어 2편 sed
에 대해서 정리해 보도록 하겠습니다.
awk 명령어(1/3)
sed 명령어(2/3)
cut 명령어(2/3)
1. sed 란?
sed는 Stream EDitor의 약자로 매우 컴팩트한 명령 체계를 이용하여 텍스트를 파싱하고 변형하는 (고대의) 텍스트 편집 도구이다. sed는 그 전신이 되는 ed의 스크립팅 체계를 기반으로 하고 있다. vim과 같이 편집될 텍스트를 화면상에 보면서 내용을 작성/수정하는 개념의 텍스트 편집기가 개발되기 이전의 텍스트 편집기이다.
일반적으로 에디터로 텍스트를 조작하려 할 때, 사람들이 주로 하는 방식은 다음과 같을 것입니다.
- 에디터를 켭니다.
- 편집할 텍스트파일을 다.
- 편집할 위치로 커서를 이동합니다.
- 내용을 수정합니다.
- 파일을 저장합니다.
- 에디터를 닫습니다.
그런데, 위의 과정을 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
- 치환
sed 's/addrass/address/' list.txt : addrass를 address로 바꾼다. 단, 원본파일을 바꾸지 않고 표준출력만 한다.
sed 's/\t/\ /' list.txt : 탭문자를 엔터로 변환
- 삭제
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
에 대해서 알아보는 시간을 갖도록 하겠습니다.