sed는 정말 강력한 명령어입니다.

디버깅을 위해서 source의 define이나 코드들을 변경해야 할 때, 그때마다 source를 열어서 변경하지 않고, shell script를 실행해서 변경하고자 할 때 유용합니다.

이미 많은 post들이 있지만, 이글을 쓰는 이유는 sed를 이용해서 하나의 line 뿐만 아니라, 두개의 line에 대해서도 작업을 할 수 있었고, 이를 정리하기 위해서 입니다.

 

기본적인 예제는 다음과 같습니다.

 

1. 이름이 '파일_name'인 파일에서 '찾고자 하는 문자열'을 가진 문자열을 출력하는 예제

sed -n '/찾고자 하는 문자열/p' 파일_name

'찾고자 하는 문자열'에 대해서 다양한 패턴들을 넣어서 실험할 때, 실제로 해당 패턴들이 정상적으로 동작하는지 출력을 통해서 확인할 수 있습니다.

즉, sed를 이용해서 shell script를 작성하기에 앞서, 실제 동작 검증용(디버깅용)으로 사용할 수 있습니다.

 

2. 이름이 '파일_name'인 파일에서 문장이 '//#define ENABLE_TEST' 문자열로 시작하는 경우, 해당 문자열을 '#define ENABLE_TEST'로 변경하는 예제

sed -i 's/^\/\/#define ENABLE_TEST/#define ENABLE_TEST/' 파일_name

 

3. 이름이 '파일_name'인 파일에서, 'something'이라는 문자열을 찾고, 'something'이라는 문자열을 포함하여 5줄(+5)을 제거(d)하는 예제 (https://ksr930.tistory.com/14)

$ sed -i '/something/,+5 d' 파일_name

 

4. 이름이 '파일_name'인 파일에서, 'something'이라는 문자열을 갖는 라인을 찾고, 다음 라인에서 'special'이라는 문자열이 있는 경우 처리하는 예제

(https://stackoverflow.com/questions/18620153/find-matching-text-and-replace-next-line/18622953)

# 1
sed -n '/something/{n;/special/p}' 파일_name
# 2
sed -n '/something/{n;s/special/not special/p}' 파일_name
# 3
sed -i '/something/{n;s/special/not special/}' 파일_name

 

위의 코드에는 3개의 예제가 있습니다.

'# 1'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 출력합니다. (초기 디버깅용)

'# 2'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 'not special'로 변경한 후 출력합니다. (초기 디버깅용)

'# 3'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 'not special'로 파일을 변경합니다. (최종)

 

위에 참고한 post들은 적었고, (저도 다 읽지는 않았습니다만) 추가로 유용해 보이는 post들은 다음과 같습니다.

 

https://jhnyang.tistory.com/287

 

[리눅스/유닉스] 유용 명령어 sed를 살펴보자! sed 명령어 사용법과 예시, 패턴 스페이스와 홀드 스

[리눅스 유닉스 완전정복 목차] 안녕하세요. 주인장 양햄찌입니다. 오늘은 sed 명령어에 대해 살펴보려고 해요. SED 명령어 알기, SED는 무슨 명령어야? vi편집기 아시죵~ sed 명령어도 vi편집기처럼

jhnyang.tistory.com

 

https://snipcademy.com/shell-scripting-sed#the-hold-buffer-space

 

Bash Shell Scripting: Sed - Snipcademy

Introduction to sed Sed (short for stream editor) is a non-interactive command line program that takes some text input, performs some command, and prints the results to standard out. Its support for regular expressions makes it extremely powerful, and is o

snipcademy.com

 

- 끝 -

반응형

'프로그래밍 > Linux_commands' 카테고리의 다른 글

[Linux] uniq  (0) 2019.12.15
[Linux] find  (0) 2019.12.15
[Linux] grep  (0) 2019.04.24

개요

리눅스를 개발환경으로 해서 프로그래밍을 하다보면 grep을 많이 사용하게 됩니다. 특히나 소스 코드를 직접 개발하기 보다는, 이미 개발되어 있는 소스 코드를 이용하는 경우에는 더욱 많이 사용합니다.
유용한 grep의 옵션들을 정리합니다.

 

[참고] 리눅스는 하나의 작업을 위한 매우 다양한 방법을 제공합니다. 당연히 본문의 예제들보다 효과적인 방법들이 있을 것입니다.

 

원하는 라인 전후 출력하기

프로그래밍에서는 grep으로 특정 keyword를 포함하는 파일들을 검색한후, 해당 파일들을  editor로 열어서 검토합니다. 그런데, 프로그래밍 이외에 매우 많은 양의 로그파일들에서 정형화된 포맷의 문제 부분들을 찾아서 검토하는 예의 경우, 일일이 파일들을 열어서 문제점을 검토하기는 번거롭습니다.

또 "git log"로 commit된 내용을 확인할 때, 특정 keyword로 내용을 확인한 후 해당 keyword 앞서에 위치하는 commit ID를 알아서 전체 내용을 검토하고자 할 때 유용합니다.

이때 grep의 -A 혹은 -B 옵션을 사용할 수 있습니다.

 

[기본]

grep -A 라인수1 -B 라인수2 키워드 파일명

 

[해석]

파일명의 이름을 갖는 파일에서 키워드를 찾아서, 키워드를 포함하는 라인 이후(-A 옵션) 라인수1 만큼의 라인, 키워드를 포함하는 라인 이전(-B 옵션) 라인수2 만큼의 라인을 출력한다.

 

[예제]

grep -A 10 -B 5 "Internal error" kernel_panic.txt

 

참조 sites

https://iknow.tistory.com/entry/grep-사용해서-원하는-라인-전후까지-출력하기

반응형

'프로그래밍 > Linux_commands' 카테고리의 다른 글

[Linux] sed  (0) 2021.07.10
[Linux] uniq  (0) 2019.12.15
[Linux] find  (0) 2019.12.15

+ Recent posts