'linux sed'에 해당되는 글 1건

  1. 2014.06.01 sed awk 사용법
Linux 2014. 6. 1. 16:28

-n 파일 안에서의 패턴이 발견된 라인 및 라인 번호
-v 패턴이 발견되지 않은 라인
-i 대소구분 무시(ignore)
-l 패턴이 들어있는 파일 이름만
-c 패턴이 들어있는 라인 번호만

 

#### 줄 관련 명령어와 기능 
d  텍스트 줄 삭제 명령 
a\   텍스트 줄 다음에 첨가 명령
i\    텍스트 줄 앞에 첨가 명령
c\   텍스트 줄 변경 명령 
n      다음 텍스트 줄을 읽는 명령
g      전파일 부분을 치환하는 명령
=      현재 줄 번호를 출력
[/패턴/]=   대응되는 줄의 패턴과 일치하는 각 줄의 번호를 표준 출력
p     패턴 일치되는 줄을 표준 출력
s/패턴/대체패턴/      플래그 패턴을 대체패턴으로 바꿈.  플래그는 g, p, wfile 
y/문자열1/문자열2/     문자열1과 문자열2를 서로 바꿈

 

^      : ^패턴            : 패턴으로 시작하는 모든 라인 찾기
$      : 패턴$           : 패턴으로 끝나는 모든 라인 찾기
.       : d...              : d로 시작하는 4자리 character 찾기
*      : [a-d]*          : a, b, c, d로 시작하는 character 찾기
[]    : [Dd]atabase  : Database 또는 database 찾기
[^]   : [^D]             : D가 나타나지 않는 라인 찾기


# sed '#d' filename      : # 라인만 삭제
# sed '$d' filename      : 마지막 라인 삭제 
# sed '#,$d' filename   : # 라인부터 마지막 라인까지 지우기
# sed '#,#d' filename   : # 라인부터 # 라인까지 지우기 
# sed '1d' sed_test     # 1 라인만 삭제
# sed '$d' sed_test     # 마지막 라인만 삭제
# sed '/purpose/d' sed_test > set_out     # sed 처리 결과를 sed_out 으로 저장
# cat set_out
# sed '/purpose/p' sed_test             # 패턴이 포함된 라인이 두번 출력(print)된다. 
# sed -n '/purpose/p' sed_test        # 패턴이 포함된 라인만 출력된다.
# sed 's/$/  Oracle/' sed_test       # 각 라인의 마지막에 원하는 글자 추가
# sed 's/  */#/g' sed_test              # space를 찾아서 #기호로 변환한다.
# sed 's/  */-/g' sed_test              # space를 찾아서 -기호로 변환한다.
                                                               # * 기호 앞에 space가 두개라는 점에 유의

## 한번에 여러 가지 편집 수행
# sed -e 's/database/DATABASE/g' -e 's/information/INFORMATION/g' sed_test

 

▒ awk : 패턴 검색과 처리를 위한 언어  >>  awk '{ action}' filename

# ls -l | awk '{print $0}'              # 전체 필드가 모두 나타나도록...
# ls -l | awk '{print $1}'                    # 1번 필드만 나타도록...
# ls -l | awk '{print $1, $9}'               # 1번과 9번 필드만 나타나도록...
# ls -l | awk '{print $3 "\t" $4 "\t" $9}'                # Tab 키가 적용된 결과...
# ls -lt | awk '{print $9, "is using", $5, "bytes"}'     # text 추가
# ls -lt | awk '$5 <= 200 {print $0}'   # 5번 필드가 200 이하일 경우 출력    






# linux sed사용법


sed로 텍스트 편집하기

sed (stream editor) : 그래픽 인터페이스가 없는 명령행 유틸리티임 그래서 많은 편집 작업을 일괄적!으로 처리하기에 아주! 적합한 도구이다.

sed는 파일을 한행씩 처리하고 현재 작업중인 라인을 패턴스페이스란 곳에 저장함

 

# 사용 문법

sed 'command' [filename]

sed s/regular_expression/replacement_String/flags input_file

 

ex) sed s/file_nmae/file_name/ > filename.txt


## sed 명령어들

d : 행 삭제

h : 패턴스페이스 내용을 홀드스페이스로 복사

H : 패턴스페이스 내용을 홀드스파이스로 추가

g : 홀드스페이스 내용을 패턴스페이스에 복사

G : 홀드스페이스 내용을 패턴스페이스에 추가

p : 행을 출력함

n : 다음입력

q : sed 종료

r : 파일로 부터 행을 읽어 온다

! : 선택된 행을 제외한 나머지 전체 행에 명령어를 적용

s : 문자열을 치환함


** s - 검색 & 치환

s는 검색과 치환을 수행한다는 뜻이다. 슬래시(/)로 검색하고 치환할 정규 표현식을 지정한다.

ex) sed s/filename/filename.txt/ filename.txt

filename.txt에 있는 filename이란 스트링을 filename.txt로 치환한다.  

 

** \ -역슬래시

역슬래시(\)는 이스케이프 문자라고 부르는데 \다음에 오는 문자는 정규표현식으로 해석하지 않는다.  결국 스트링에 특수기호가 포함되어 있을때 \를 사용한다.

ex) sed s/\$FL/\$FILELIST/ filename.txt

 

** 한행에 여러번 나오는 문자열 교체하기 (flag : g)

sed는 행단위 편집기로, 행을 한번에 하나씩 메모리로 읽은 후 한단위로 처리한다.

sed를 실행할 때는 이 사실을 명심해야한다. 모든 명령행 옵션도 이러한 설계 철학에 기반을 두기 때문이다.

기본적으로 행마다 sed 명령을 새롭게 적용한다고 이해하면 되겠다

그래서 한줄에 같은 단어가 2개 이상 있다면 하나만 바뀌고 끝난다.

 

filename : prj.txt

project : aaa.prj, project : aaa

project : ok

위에 내용에서 project를 project_name로 바꾸고 싶다면

 

sed s/project/project_name/ prj.txt

그러나!! 두번째 둘의 콤마(,)뒤의 project는 바뀌지 않은것을 볼수 있을 것이다.

그래서 다음과 같이 g flag(global)를 이용한다.

sed s/project/project_name/g prj.txt

 

** 선행검색 

s앞에 /string/을 사용하면 선행검색이 가능하다

ex) sed /okplayers/s/players :/artist :/ playerlists.txt

 okplayers가 있는 줄을 찾아 players :를 artist :로 바꾸어라

 

** 콜론(:)으로 끝나는 문자열 모두 변경하기

정규표현식을 이용한 sed 활용법을 정리해 보자

filename:$FLN

system "echo project:$project"

system "echo version:$version"

위의 문자에서 :으로 끝나는 문자열을 모두 변경하여 보자!!!

 

sed s/[a-z]*:/value:/g system.txt

 

변경된 내용은 다음과 같다

value:$FLN

system "echo value:$project"

system "echo value:$version"

 

그러나!! 이것보다 더 좋은 것이 있었으니,

일정 형식의 string에 앞에 어떤 단어를 추가 하고 싶을 때

기존의 filename:, project:, version: 앞에 new_를 추가 하고 싶으면 앰퍼센트를(&) 사용하면된다.

 

** 앰퍼센트(&)

위의 내용에서 각각의 콜론 앞 스트링에 new_를 붙이고 싶다면!!

filename:$FLN

system "echo project:$project"

system "echo version:$version"

 

sed s/[a-z]*:/new_\&/g system.txt

new_filename:$FLN

system "echo new_project:$project"

system "echo new_version:$version" 이렇게 됨 ㅎㅎ

 

와우 다음은 awk를 정리해 보아요 ㅎㅎㅎ

 

<출처>

http://blog.naver.com/PostView.nhn?blogId=heewon0117&logNo=120088332695&viewDate=&currentPage=1&listtype=0

[출처] sed, awk 사용법 2|작성자 오이씨


//