Command Line - 텍스트 편집
[cmd_test@btjeon-naver ~]$ cat > foo.txt
The quick brown fox jumped over the lazy dog.
[cmd_test@btjeon-naver ~]$ cat -A foo.txt
^IThe quick brown fox jumped over the lazy dog. $
cat 명령어의 -A 옵션은 텍스트 내의 비출력 문자를 표시한다.
(^I는 탭 문자를, $는 공백을 의미한다.)
(캐리지 리턴값을 색출하는 데 유용하게 사용할 수 있다.)
[cmd_test@btjeon-naver ~]$ cat > foo.txt
The quick brown fox
jumped over the lazy dog.
[cmd_test@btjeon-naver ~]$
[cmd_test@btjeon-naver ~]$
[cmd_test@btjeon-naver ~]$ cat -ns foo.txt
1 The quick brown fox
2
3 jumped over the lazy dog.
-n 옵션은 줄 번호를 매기고 -s는 여러 공백 줄을 제거하는 옵션이다.
[cmd_test@btjeon-naver ~]$ sort > foo.txt
c
b
a
[cmd_test@btjeon-naver ~]$ cat foo.txt
a
b
c
sort 명령어는 표준 입력이나 커맨드라인에 명시된 하나 이상의 파일의 내용물들을 정렬하고 표준 출력으로 결과를 전달한다.
다음과 같이 여러 개의 파일을 전부 합쳐 정렬된 형태의 파일로 만들 수 있다.
sort file1.txt file2.txt file3.txt > final_sorted_list.txt
<sort 주요 옵션>
옵션 | Long 옵션 | 설명 |
-b | --ignore-leading-blanks | 기본적으로 정렬은 각 줄의 첫 문자를 대상으로 전체에 실행한다. 이 옵션은 각 줄의 첫 공백들은 무시하고 공백이 아닌 첫 문자를 기준으로 정렬한다. |
-f | --ignore-case | 정렬 시에 대소문자를 구분하지 않도록 한다. |
-n | --numeric-sort | 이 옵션을 사용하면 알파벳 대신 수치를 기준으로 정렬한다. |
-r | --reverse | 역순(내림차순)으로 정렬한다. |
-k | --key=field1[,field2] | 필드 전체가 아닌 키 필드로 지정된 field1부터 field2까지를 기준으로 정렬한다. |
-m | --merge | 복수의 파일을 추가적인 정렬 없이 하나의 정렬된 결과로 합친다. |
-o | --output=file | 정렬된 결과를 표준 출력이 아닌 file로 보낸다. |
-t | --field-separator=char | 필드 구분 문자를 정의한다. 기본적으로 스페이스나 탭으로 필드를 구분한다. |
[cmd_test@btjeon-naver ~]$ du -s /usr/share/* | sort -nr | head
du: cannot read directory ‘/usr/share/polkit-1/rules.d’: Permission denied
113948 /usr/share/locale
79128 /usr/share/doc
43340 /usr/share/man
25224 /usr/share/vim
20356 /usr/share/perl5
18828 /usr/share/backgrounds
9704 /usr/share/i18n
9248 /usr/share/systemtap
9192 /usr/share/cracklib
7664 /usr/share/hwdata
디스크 사용량이 많은 경로명을 상위 10개로 보여준다.
[cmd_test@btjeon-naver ~]$ ls -l /usr/bin | sort -nr -k 5 | head
-rwxr-xr-x. 1 root root 8885520 Apr 1 2020 doxygen
-rwxr-xr-x. 1 root root 6826328 Apr 1 2020 gdb
-rwxr-xr-x. 1 root root 5354192 May 13 2020 ld.gold
-rwxr-xr-x. 1 root root 3555792 Apr 1 2020 stap
-rwxr-xr-x. 1 root root 3177968 May 13 2020 dwp
-rwxr-xr-x. 1 root root 2337192 Aug 9 2019 vim
-rwxr-xr-x. 1 root root 1558072 Aug 7 2020 systemd-analyze
-rwxr-xr-x. 113 root root 1527752 May 29 2020 git-upload-archive
-rwxr-xr-x. 113 root root 1527752 May 29 2020 git-receive-pack
-rwxr-xr-x. 113 root root 1527752 May 29 2020 git
파일 크기의 역순으로 상위 10개로 보여준다. (-k 5 옵션은 5번째 필드를 정렬키로 지정한다.)
SUSE 10.2 12/07/2006
Fedora 10 11/25/2008
SUSE 11.0 06/19/2008
Ubuntu 8.04 04/24/2008
Fedora 8 11/08/2007
SUSE 10.3 10/04/2007
Ubuntu 6.10 10/26/2006
Fedora 7 05/31/2007
Ubuntu 7.10 10/18/2007
Ubuntu 7.04 04/19/2007
SUSE 10.1 05/11/2006
Fedora 6 10/24/2006
Fedora 9 05/13/2008
Ubuntu 6.06 06/01/2006
Ubuntu 8.10 10/30/2008
Fedora 5 03/20/2006
distos.txt
[cmd_test@btjeon-naver ~]$ sort distos.txt
Fedora 10 11/25/2008
Fedora 5 03/20/2006
Fedora 6 10/24/2006
Fedora 7 05/31/2007
Fedora 8 11/08/2007
Fedora 9 05/13/2008
SUSE 10.1 05/11/2006
SUSE 10.2 12/07/2006
SUSE 10.3 10/04/2007
SUSE 11.0 06/19/2008
Ubuntu 6.06 06/01/2006
Ubuntu 6.10 10/26/2006
Ubuntu 7.04 04/19/2007
Ubuntu 7.10 10/18/2007
Ubuntu 8.04 04/24/2008
Ubuntu 8.10 10/30/2008
Fedora 10 버전이 맨 위로 올라가서 정렬되었다.
[cmd_test@btjeon-naver ~]$ sort --key=1,1 --key=2n distos.txt
Fedora 5 03/20/2006
Fedora 6 10/24/2006
Fedora 7 05/31/2007
Fedora 8 11/08/2007
Fedora 9 05/13/2008
Fedora 10 11/25/2008
SUSE 10.1 05/11/2006
SUSE 10.2 12/07/2006
SUSE 10.3 10/04/2007
SUSE 11.0 06/19/2008
Ubuntu 6.06 06/01/2006
Ubuntu 6.10 10/26/2006
Ubuntu 7.04 04/19/2007
Ubuntu 7.10 10/18/2007
Ubuntu 8.04 04/24/2008
Ubuntu 8.10 10/30/2008
배포판 이름, 버전 번호 순으로 정렬
(key=1,1 --> 1번 필드로 시작해서 1번으로 끝남. key=2n --> 1번 필드가 정렬 키이고 숫자값 정렬.)
[cmd_test@btjeon-naver ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distos.txt
Fedora 10 11/25/2008
Ubuntu 8.10 10/30/2008
SUSE 11.0 06/19/2008
Fedora 9 05/13/2008
Ubuntu 8.04 04/24/2008
Fedora 8 11/08/2007
Ubuntu 7.10 10/18/2007
SUSE 10.3 10/04/2007
Fedora 7 05/31/2007
Ubuntu 7.04 04/19/2007
SUSE 10.2 12/07/2006
Ubuntu 6.10 10/26/2006
Fedora 6 10/24/2006
Ubuntu 6.06 06/01/2006
SUSE 10.1 05/11/2006
Fedora 5 03/20/2006
날짜 역순으로 정렬
(k 3,7 --> 3번 필드의 7번째 문자에서 시작하는 정렬 키 사용)
[cmd_test@btjeon-naver ~]$ sort -t ':' -k 7 /etc/passwd | head
cmd_test:x:1001:1001::/home/cmd_test:/bin/bash
nbpmon:x:1000:1000:agent-account:/home1/nbpmon:/bin/bash
root:x:0:0:root:/root:/bin/bash
abrt:x:173:173::/etc/abrt:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
passwd 파일의 7번째 필드(사용자 기본 쉘)을 기준으로 정렬 (t 옵션으로 구분자 지정)
[cmd_test@btjeon-naver ~]$ cat > foo.txt
a
b
c
a
b
c
[cmd_test@btjeon-naver ~]$ uniq foo.txt
a
b
c
a
b
c
[cmd_test@btjeon-naver ~]$ sort foo.txt | uniq
a
b
c
uniq 명령어를 통해 중복을 제거할 수 있는데, sort 등으로 먼저 입력 내용을 정렬해야 한다.
<uniq 주요 옵션>
옵션 | 설명 |
-c | 중복 발생 횟수와 함께 중복 행의 목록을 출력한다. |
-d | 유일한 행이 아닌 중복된 행들만을 출력한다. |
-f n | 각 행의 n개의 필드까지 무시한다. (sort와 달리 uniq는 구분자를 설정하는 옵션이 없다.) |
-i | 행 비교시 대소문자 구별을 하지 않는다. |
-s n | 각 행의 n개의 문자까지 무시한다. |
-u | 유일한 행들만 출력한다. (기본값) |
[cmd_test@btjeon-naver ~]$ sort foo.txt | uniq -c
2 a
2 b
2 c
중복 발생 횟수를 같이 출력한다.
<cut 선택 옵션>
옵션 | 설명 |
-c char_list | char_list에 정의된 영역을 추출한다. 이 목록은 하나 이상의 콤마로 구분된 글자 범위다. |
-f field_list | field_list에 정의된 하나 이상의 필드를 추출한다. 이 목록은 하나 이상의 콤마로 구분된 필드 범위다. |
-d delim_char | -f로 지정했을 때 delim_char를 필드 구분자로 사용한다. 기본적으로 필드들은 하나의 탭문자로 구분되어야 한다. |
--complement | -c 또는 -f로 명시된 영역을 제외한 모든 부분을 추출한다. |
[cmd_test@btjeon-naver ~]$ cat -A distos.txt
SUSE^I10.2^I12/07/2006$
Fedora^I10^I11/25/2008$
SUSE^I11.0^I06/19/2008$
Ubuntu^I8.04^I04/24/2008$
Fedora^I8^I11/08/2007$
SUSE^I10.3^I10/04/2007$
Ubuntu^I6.10^I10/26/2006$
Fedora^I7^I05/31/2007$
Ubuntu^I7.10^I10/18/2007$
Ubuntu^I7.04^I04/19/2007$
SUSE^I10.1^I05/11/2006$
Fedora^I6^I10/24/2006$
Fedora^I9^I05/13/2008$
Ubuntu^I6.06^I06/01/2006$
Ubuntu^I8.10^I10/30/2008$
Fedora^I5^I03/20/2006$
탭 구분자 확인
[cmd_test@btjeon-naver ~]$ cut -f 3 distos.txt
12/07/2006
11/25/2008
06/19/2008
04/24/2008
11/08/2007
10/04/2007
10/26/2006
05/31/2007
10/18/2007
04/19/2007
05/11/2006
10/24/2006
05/13/2008
06/01/2006
10/30/2008
03/20/2006
cut 명령어를 통해 3번째 필드를 추출한다.
[cmd_test@btjeon-naver ~]$ cut -f 3 distos.txt | cut -c 7-10
2006
2008
2008
2008
2007
2007
2006
2007
2007
2007
2006
2006
2008
2006
2008
2006
3번째 필드의 년도 추출
[cmd_test@btjeon-naver ~]$ cut -d ':' -f 1 /etc/passwd | head
root
bin
mail
nobody
systemd-network
dbus
polkitd
sshd
postfix
rpc
다른 필드 구분자를 지정해서 추출
[cmd_test@btjeon-naver ~]$ expand distos.txt | cut -c 23-
2006
2008
2008
2008
2007
2007
2006
2007
2007
2007
2006
2006
2008
2006
2008
2006
expand 명령어는 탭문자를 공백 문자로 치환한다. unexpand는 공백 문자를 탭문자로 치환하는 기능을 제공한다.
[cmd_test@btjeon-naver ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distos.txt > distros-bydate.txt
[cmd_test@btjeon-naver ~]$ cut -f 1,2 distros-bydate.txt > distros-versions.txt
[cmd_test@btjeon-naver ~]$ head distros-versions.txt
Fedora 10
Ubuntu 8.10
SUSE 11.0
Fedora 9
Ubuntu 8.04
Fedora 8
Ubuntu 7.10
SUSE 10.3
Fedora 7
Ubuntu 7.04
[cmd_test@btjeon-naver ~]$ cut -f 3 distros-bydate.txt > distros-dates.txt
[cmd_test@btjeon-naver ~]$ head distros-dates.txt
11/25/2008
10/30/2008
06/19/2008
05/13/2008
04/24/2008
11/08/2007
10/18/2007
10/04/2007
05/31/2007
04/19/2007
paste 테스트 준비...
[cmd_test@btjeon-naver ~]$ paste distros-dates.txt distros-versions.txt
11/25/2008 Fedora 10
10/30/2008 Ubuntu 8.10
06/19/2008 SUSE 11.0
05/13/2008 Fedora 9
04/24/2008 Ubuntu 8.04
11/08/2007 Fedora 8
10/18/2007 Ubuntu 7.10
10/04/2007 SUSE 10.3
05/31/2007 Fedora 7
04/19/2007 Ubuntu 7.04
12/07/2006 SUSE 10.2
10/26/2006 Ubuntu 6.10
10/24/2006 Fedora 6
06/01/2006 Ubuntu 6.06
05/11/2006 SUSE 10.1
03/20/2006 Fedora 5
paste 명령어는 하나 이상의 텍스트 열을 추가한다.
[cmd_test@btjeon-naver ~]$ cut -f 1,1 distros-bydate.txt > distros-names.txt
[cmd_test@btjeon-naver ~]$ paste distros-dates.txt distros-names.txt > distros-key-names.txt
[cmd_test@btjeon-naver ~]$ head distros-key-names.txt
11/25/2008 Fedora
10/30/2008 Ubuntu
06/19/2008 SUSE
05/13/2008 Fedora
04/24/2008 Ubuntu
11/08/2007 Fedora
10/18/2007 Ubuntu
10/04/2007 SUSE
05/31/2007 Fedora
04/19/2007 Ubuntu
[cmd_test@btjeon-naver ~]$ cut -f 2,2 distros-bydate.txt > distros-vernums.txt
[cmd_test@btjeon-naver ~]$ paste distros-dates.txt distros-vernums.txt > distros-key-vernums.txt
[cmd_test@btjeon-naver ~]$ head distros-key-vernums.txt
11/25/2008 10
10/30/2008 8.10
06/19/2008 11.0
05/13/2008 9
04/24/2008 8.04
11/08/2007 8
10/18/2007 7.10
10/04/2007 10.3
05/31/2007 7
04/19/2007 7.04
join 테스트 준비...
[cmd_test@btjeon-naver ~]$ join distros-key-names.txt distros-key-vernums.txt | head
11/25/2008 Fedora 10
10/30/2008 Ubuntu 8.10
06/19/2008 SUSE 11.0
05/13/2008 Fedora 9
04/24/2008 Ubuntu 8.04
11/08/2007 Fedora 8
10/18/2007 Ubuntu 7.10
10/04/2007 SUSE 10.3
05/31/2007 Fedora 7
04/19/2007 Ubuntu 7.04
join 명령어는 특정 키 필드를 기준으로 복수의 파일을 합쳐서 가져온다. (RDBMS join 형태)
join이 제대로 동작하려면 파일들이 키 필드를 기준으로 정렬되어 있는 것이 중요하다.
또한 기본적으로 입력 필드 구분자로 공백문자를 사용하고 출력 필드 구분자로 하나의 공백을 사용한다.
(옵션을 통해 변경 가능)
[cmd_test@btjeon-naver ~]$ cat > file1.txt
a
b
c
d
[cmd_test@btjeon-naver ~]$ cat > file2.txt
b
c
d
e
[cmd_test@btjeon-naver ~]$ comm file1.txt file2.txt
a
b
c
d
e
comm 명령어는 두 텍스트 파일을 비교하여 각각 유일한 행과 공통된 행들을 표시한다.
1번째 열 : 1번째 파일의 유일한 행
2번째 열 : 2번째 파일의 유일한 행
3번째 열 : 두 파일의 공통된 행
[cmd_test@btjeon-naver ~]$ comm -12 file1.txt file2.txt
b
c
d
-n(숫자) 옵션으로 제거할 열을 지정할 수 있다.
[cmd_test@btjeon-naver ~]$ diff file1.txt file2.txt
1d0
< a
4a4
> e
diff 명령어로 행 단위로 비교할 수 있으며, 기본 포맷으로 출력하게 된다.
기본적인 출력 포맷은 첫 번째 파일에서 두 번째 파일로 변환된 위치와 형태에 대해 설명한다.
<diff 변경 명령>
변경 명령 | 설명 |
r1ar2 | 두 번째 파일의 r2 위치에 있는 행을 첫 번째 파일의 r1 위치에 추가 |
r1cr2 | r1 위치에 있는 행을 두 번째 파일의 r2 위치의 행으로 변경 |
r1dr2 | 두 번째 파일의 r2 위치에 있어야 할 행을 첫 번째 파일의 r1 위치에서 삭제 |
[cmd_test@btjeon-naver ~]$ diff -c file1.txt file2.txt
*** file1.txt 2022-06-02 11:25:30.231835775 +0900
--- file2.txt 2022-06-02 11:25:39.592828802 +0900
***************
*** 1,4 ****
- a
b
c
d
--- 1,4 ----
b
c
d
+ e
문맥 방식(-c) 보기
<diff 문맥 방식 변경 지시자>
지시자 | 의미 |
(없음) | 문맥 표시 행. 두 파일 간의 차이점을 나타내지 않는다. |
- | 삭제된 행. 이 행은 첫 번째 파일에는 나타나지만 두 번째 파일에는 나타나지 않을 것이다. |
+ | 추가된 행. 이 행은 두 번째 파일에는 나타나지만 첫 번째 파일에는 나타나지 않을 것이다. |
! | 변경된 행. 이 행은 두 가지 버전이 표시될 것이다. 변경 내역의 각자의 영역에 각각 표시된다. |
[cmd_test@btjeon-naver ~]$ diff -u file1.txt file2.txt
--- file1.txt 2022-06-02 11:25:30.231835775 +0900
+++ file2.txt 2022-06-02 11:25:39.592828802 +0900
@@ -1,4 +1,4 @@
-a
b
c
d
+e
통합 방식(-u) 보기 - 문맥 방식에 비해 중복 행은 제거된다.
<diff 통합 방식 변경 지시자>
지시자 | 의미 |
(없음) | 이 행은 두 파일 모두 공유한다. |
- | 이 행은 첫 번째 파일에서 삭제된다. |
+ | 이 행은 첫 번째 파일에서 추가된다. |
[cmd_test@btjeon-naver ~]$ diff -Naur file1.txt file2.txt > patchfile.txt
[cmd_test@btjeon-naver ~]$ patch < patchfile.txt
patching file file1.txt
[cmd_test@btjeon-naver ~]$ cat file1.txt
b
c
d
e
[cmd_test@btjeon-naver ~]$ cat patchfile.txt
--- file1.txt 2022-06-02 11:25:30.231835775 +0900
+++ file2.txt 2022-06-02 11:25:39.592828802 +0900
@@ -1,4 +1,4 @@
-a
b
c
d
+e
patch 명령어는 diff의 출력 결과를 받아서 이전 버전의 파일을 새 버전으로 변환시키는 데 일반적으로 사용된다.
[cmd_test@btjeon-naver ~]$ echo "lowercase letters" | tr a-z A-Z
LOWERCASE LETTERS
tr 명령어를 통해 문자들을 변환할 수 있다.
[cmd_test@btjeon-naver ~]$ echo "lowercase letters" | tr [:lower:] A
AAAAAAAAA AAAAAAA
여러 문자들을 하나의 문자로 변환하기
[cmd_test@btjeon-naver ~]$ cat -A dos.txt
my name is byegontae jeon.^M$
I am a professional engineer.^M$
Good Job!!!^M$
[cmd_test@btjeon-naver ~]$ tr -d '\r' < dos.txt > unix.txt
[cmd_test@btjeon-naver ~]$ cat -A unix.txt
my name is byegontae jeon.$
I am a professional engineer.$
Good Job!!!$
이와 같이 MS-DOS 텍스트 파일을 유닉스 스타일의 텍스트로 변환할 수 있다. (-d 옵션은 문자열을 삭제하는 옵션)
[cmd_test@btjeon-naver ~]$ echo "aaabbbccc" | tr -s ab
abccc
-s 옵션을 사용하여 문자의 반복 개체를 축소할 수 있다.
[cmd_test@btjeon-naver ~]$ echo "abcabcabc" | tr -s ab
abcabcabc
반복 문자들은 반드시 인접해야 한다.
[cmd_test@btjeon-naver ~]$ echo "front" | sed 's/front/back/'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed 's_front_back_'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed 's-front-back-'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed 'ssfrontsbacks'
back
sed는 텍스트 스트림과 명시된 파일 집합과 표준 입력에서도 텍스트 편집을 수행한다. 기본적으로 슬래시(/) 문자가 구분자로 사용되지만, 다른 문자들도 가능하다.
[cmd_test@btjeon-naver ~]$ echo "front" | sed '1s/front/back/'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed '2s/front/back/'
front
위와 같이 편집될 입력 스트림의 행 번호를 지정할 수 있다.
<sed 주소 표기법>
주소 | 설명 |
n | 행 번호 |
$ | 마지막 행 |
/regexp/ | POSIX 기본 정규 표현식과 일치하는 행들. 정규 표현식은 슬래시 문자로 구분된다. 부가적으로 정규 표현식은 /cregexpc를 표현식과 함께 명시하면 다른 문자로 구분될 수 있다. 여기서 c는 구분자로 사용할 대체 문자다. |
addr1, addr2 | addr1부터 addr2까지의 범위의 행들. 주소는 단일 주소 형태의 어느 것이든 상관없다. |
first~step | first 번호에 표현된 것과 일치하는 행과 그 다음 step 간격마다 모든 행. 예를 들어 1~2는 모든 홀수 행을, 5~5는 5번 행과 그 이후 5번째 행을 가리킨다. |
addr1, +n | addr1과 일치하는 행과 다음 n개의 행들 |
addr! | addr을 제외한 모든 행. addr에는 위 형태 중 어느 것이든 올 수 있다. |
[cmd_test@btjeon-naver ~]$ sed -n '1,5p' distros.txt
SUSE 10.2 12/07/2006
Fedora 10 11/25/2008
SUSE 11.0 06/19/2008
Ubuntu 8.04 04/24/2008
Fedora 8 11/08/2007
1~5번 행의 내용을 출력한다. p가 단순 출력 명령이다.
[cmd_test@btjeon-naver ~]$ sed -n '/SUSE/p' distros.txt
SUSE 10.2 12/07/2006
SUSE 11.0 06/19/2008
SUSE 10.3 10/04/2007
SUSE 10.1 05/11/2006
SUSE가 포함된 행들을 출력한다.
[cmd_test@btjeon-naver ~]$ sed -n '/SUSE/!p' distros.txt
Fedora 10 11/25/2008
Ubuntu 8.04 04/24/2008
Fedora 8 11/08/2007
Ubuntu 6.10 10/26/2006
Fedora 7 05/31/2007
Ubuntu 7.10 10/18/2007
Ubuntu 7.04 04/19/2007
Fedora 6 10/24/2006
Fedora 9 05/13/2008
Ubuntu 6.06 06/01/2006
Ubuntu 8.10 10/30/2008
Fedora 5 03/20/2006
SUSE가 포함된 행만 제외하고 출력한다.
<sed 기본 편집 명령어>
주소 | 설명 |
= | 현재 행번호를 출력한다. |
a | 현재 행 뒤에 텍스트를 추가한다. |
d | 현재 행을 삭제한다. |
i | 현재 행 앞에 텍스트를 삽입한다. |
p | 현재 행을 출력한다. sed는 기본적으로 모든 행을 출력하고, 파일 내에서 지정된 주소와 일치하는 행들만 편집한다. 기본 동작은 -n 옵션을 명시하여 무시할 수 있다. |
q | 더 이상 처리할 행이 없으면 종료한다. 만약 -n 옵션이 명시되어 있지 않으면 현재 행을 출력한다. |
Q | 더 이상 처리할 행이 없으면 종료한다. |
s/regexp/replacement/ | regexp가 발견될 때마다 replacement의 내용으로 치환한다. replacement는 regexp와 일치하는 텍스트와 동등한 특수 문자 &를 포함할 수도 있다. 게다가 replacement는 regexp의 부 표현식과 상응하는 내용을 가리키는 \1부터 \9까지의 문자열을 포함할 수도 있다. replacement 다음의 '/'는 s 명령의 동작을 수정하기 위해 명시될 수 있는 옵션 플래그이다. |
y/set1/set2 | set1 문자들을 set2의 상응하는 문자들로 변환한다. sed는 tr과 달리 동일한 길이의 집합이 필요하다. |
[cmd_test@btjeon-naver ~]$ sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' distros.txt
SUSE 10.2 2006-12-07
Fedora 10 2008-11-25
SUSE 11.0 2008-06-19
Ubuntu 8.04 2008-04-24
Fedora 8 2007-11-08
SUSE 10.3 2007-10-04
Ubuntu 6.10 2006-10-26
Fedora 7 2007-05-31
Ubuntu 7.10 2007-10-18
Ubuntu 7.04 2007-04-19
SUSE 10.1 2006-05-11
Fedora 6 2006-10-24
Fedora 9 2008-05-13
Ubuntu 6.06 2006-06-01
Ubuntu 8.10 2008-10-30
Fedora 5 2006-03-20
's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/'
날짜 포맷 변경 : mm/dd/yyyy -> yyyy-mm-dd
([0-9]{2})/([0-9]{2})/([0-9]{4})$
위와 같이 [0-9]{2}와 같은 표현식을 괄호로 둘러싸면 서브 표현식을 만들 수 있으며, replacement에서 \3-\1-2 이런 식으로 후방 참조를 할 수 있다.
[cmd_test@btjeon-naver ~]$ echo "aaabbbccc" | sed 's/b/B/'
aaaBbbccc
[cmd_test@btjeon-naver ~]$ echo "aaabbbccc" | sed 's/b/B/g'
aaaBBBccc
s 명령어에서 g 플래그를 사용하면 모든 문자들을 변경할 수 있다.
[cmd_test@btjeon-naver ~]$ vi distros.sed
-----------------------------------------------------------------------------------------
# sed script to produce Linux distributions report
1 i\
\
Linux Distribution Report\
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIGKLMNOPQRSTUVWXYZ/
-----------------------------------------------------------------------------------------
sed 명령어에서 사용할 script 파일
- 입력의 첫 행 주소 1에 텍스트를 삽입하기 위애 i 명령어를 사용한다. 백슬래시 캐리지 리턴 문자(\\r)는 텍스트 스트림에 캐리지 리턴값을 내장하기 위해 사용한다.
- y 명령어는 문자 범위(예를 들어 [a-z])와 POSIX 문자 클래스를 지원하지 않는다.
[cmd_test@btjeon-naver ~]$ sed -f distros.sed distros.txt
Linux Distribution Report
SUSE 10.2 2006-12-07
FEDORA 10 2008-11-25
SUSE 11.0 2008-06-19
UBUNTU 8.04 2008-04-24
FEDORA 8 2007-11-08
SUSE 10.3 2007-10-04
UBUNTU 6.10 2006-10-26
FEDORA 7 2007-05-31
UBUNTU 7.10 2007-10-18
UBUNTU 7.04 2007-04-19
SUSE 10.1 2006-05-11
FEDORA 6 2006-10-24
FEDORA 9 2008-05-13
UBUNTU 6.06 2006-06-01
UBUNTU 8.10 2008-10-30
FEDORA 5 2006-03-20
-f 옵션을 사용해서 좀 더 복잡한 명령을 사용할 수 있다.
출처 : 리눅스 커맨드라인 완벽 입문서