확장 정규표현식 해석 옵션 - E ,   특정문자 반복 + , 공백반복 ?, 반복 횟수 지정 { }, 그룹 (), or |

e가 1번 이상 반복되는 문자를 검색

$ grep 'Be+r' drink.txt      # 'Be+r' 를 찾는 걸로 인식
$ grep -E 'Be+r' drink.txt   # 정규표현식으로 인식 -> 반복되는 문자를 출력
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!

 - 0 회 반복은 포함하지 않음

 

공백이 0회 혹은 1회 나타내는 경우를 검색

$ grep -E 'Wine ?Wine' drink.txt
Wine Wine
WineWine

- 공백뿐만 아니라 문자도 가능

반복 횟수를 지정하는 메타 문자

 e 가 1회 이상 2회 이하 반복되는 패턴을 지정

$ grep -E 'Be{1,2}' drink.txt
Ber
Beer
BeerBeer
BeerBeerBeer

 

 e 가 2번 반복되는 것을 검색

$ grep -E 'Be{2}r' drink.txt
Beer
BeerBeer
BeerBeerBeer

 

e 가 4번이상 반복되는 것을 검색

$ grep -E 'Be{4,}r' drink.txt
Beeeeeeeeer!!!

 

특정단어가 2회 이상 반복되는 패턴을 검색

$ grep -E '(Wine){2,}' drink.txt
WineWine

OR 을 이용한 검색

$ grep -E 'My (Vodka|Wine)' drink.txt
My Vodka
My Wine

 

확장 표현식 정리

기본 정규 표현식 확장 정규 표현식 의미
* * 0회 이상 반복
없음 + 1회 이상 반복
없음 ? 0회 또는 1회 반복
\{m,n\} {m,n} m회 이상 n회 이하 반복
\{m\} {m} m회 반복
\{m,\} {m, } m회 이상 반복
\(\) () 그룹화할 때 이용
없음 | 여러 정규표현식을 OR 조건으로 연결

배우는 내용 : [ 임의의 문자하나를 의미하는 ' . ' ,  여러 문자 중 를 하나를 지정하는 [ ], 

임의의 문자를 지정하는 메타 문자

예제 파일 example.txt

test.example.net
tfst.example.net
tzst.example.net
tzzst.example.net
www.example.com
www.example.org
netapp.example.com
mail1.example.com
mail3.example.com
mail7.example.com
borg.example.com

 

 임의의 문자 하나를 지정

$ grep 't.st' example.txt 
test.example.net
tfst.example.net
tzst.example.net

 

임의의 문자 두개를 지정

$ grep 't..st' example.txt
tzzst.example.net

 

.org로 검색 (기호도 포함)

$ grep '.org' example.txt
www.example.org
borg.example.com

 

이스케이프 ( \ ) 이용하여 점 ( . )기호 검색

$ grep '\.org' example.txt
www.example.org

 

특정 문자를 지정하는 메타문자

$ grep 't[ef]st' example.txt
test.example.net
tfst.example.net

$ grep 'mail[1-4]' example.txt
mail1.example.com
mail3.example.com

$ grep 'mail[^13]' example.txt
mail7.example.com

- [a-z] : a 부터 z까지 모두 지정

- [a-zA-Z] : 알파벳 모두 지정

- [^13] : mail 뒤에 1 과 3 이외의 문자

 

반복을 지정하는 메타문자

$ grep 'Be*r' drink.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
Br

 

$ grep `^B[ea]*r$' drink.txt
Ber
Beer
Bear
Br
메타문자  의미
.  임의의 문자하나
[ ] [ ] 안에 포함된 문자중 하나
[^] [ ] 안에 포함되지 않은 문자
\  \ 다음의 문자를 메타 문자로 인식하지 않는다. ( '\.com')
$ 행의 마지막을 의미 ( com$ : com 으로 끝나는 행)
^ 행의 첫 부분을 의미 (^net : net 으로 시작하는 행)
* 0회 이상의 반복을 의미 ( .* : 모든 문자열 의미)

배우는 내용 : [ grep 으로 문자열 검색해보기]

 

문자열 검색

grep [옵션] <검색 패턴> <파일 이름>

 

검색패턴 bash 이용한 예제
( -n : 행 번호도 출력, -v : 검색패턴을 포함하지않는 행 출력)

$ grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash

$ grep -n bash /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
34:ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash

$ grep -nv bash /etc/passwd
2:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3:bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

 

대소문자를 구별하지 않고 검색

$ grep -i system /etc/passwd
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin

 

조합

/etc 디렉터리에 ne 이라는 글자를 포함하는 파일을 검색

$ ls /etc | grep ne
issue.net
kernel
needrestart
netconfig
...

 

/etc 디렉터리에 ne 이라는 글자를 정규표현식 ^ 을 이용하여 검색

$ ls /etc | grep '^ne'
needrestart
netconfig
netplan
...

tail : 마지막 부분 출력하기, diff: 두 파일의 차이점 출력하기

tail

$ tail -n 5 <file> # 파일의 마지막 5행 출력
$ tail <file>      # 파일의 마지막 10행 출력

 

 

실시간으로 내용을 출력하여 파일을 모니터링 -> 주로 로그를 모니터링

tail -f <파일 이름>

 

$ tail -f output.log

diff

diff [옵션] <비교 파일 1> <비교 파일 2>

 

diff 명령어 테스트

$ diff temp_list.txt temp_listcp.txt
2c2
< lrwxrwxrwx   1 root root     7 Mar  1 02:07 bin -> usr/bin
---
> lrwxrwxrwx   1 root root     7 Mar  1 02:07 bin -> change test
7,10d6
< lrwxrwxrwx   1 root root     7 Mar  1 02:07 lib -> usr/lib
< lrwxrwxrwx   1 root root     9 Mar  1 02:07 lib32 -> usr/lib32
< lrwxrwxrwx   1 root root     9 Mar  1 02:07 lib64 -> usr/lib64
< lrwxrwxrwx   1 root root    10 Mar  1 02:07 libx32 -> usr/libx32
24a21
> ---diff command test

# 첫번째 파일의 2번째 행이 두번째 파일의 2번째 행으로 변경 :  기호  c

2c2
< lrwxrwxrwx   1 root root     7 Mar  1 02:07 bin -> usr/bin
---
> lrwxrwxrwx   1 root root     7 Mar  1 02:07 bin -> change test

 

# 첫번째 파일의 7~10행이 삭제됨 :  기호  d

7,10d6
< lrwxrwxrwx   1 root root     7 Mar  1 02:07 lib -> usr/lib
< lrwxrwxrwx   1 root root     9 Mar  1 02:07 lib32 -> usr/lib32
< lrwxrwxrwx   1 root root     9 Mar  1 02:07 lib64 -> usr/lib64
< lrwxrwxrwx   1 root root    10 Mar  1 02:07 libx32 -> usr/libx32

 

# 첫번째 파일의 24행 뒤에 두번째 파일의 21번행에 있는 내용이 추가됨: 기호 a
24a21
> ---diff command test

 

통일포맷 옵션 -u : 변화를 더 쉽게 확인 하는 방법

$diff -u temp_list.txt temp_listcp.
--- temp_list.txt	2024-03-31 10:01:39.331756376 +0000
+++ tmpe_listcp.txt	2024-04-03 04:33:22.347779185 +0000
@@ -1,13 +1,9 @@
 total 64
-lrwxrwxrwx   1 root root     7 Mar  1 02:07 bin -> usr/bin
+lrwxrwxrwx   1 root root     7 Mar  1 02:07 bin -> change test
 drwxr-xr-x   4 root root  4096 Mar 27 06:50 boot
 drwxr-xr-x  16 root root  3260 Mar 26 17:32 dev
 drwxr-xr-x  96 root root  4096 Mar 29 06:15 etc
 drwxr-xr-x   3 root root  4096 Mar 15 23:42 home
-lrwxrwxrwx   1 root root     7 Mar  1 02:07 lib -> usr/lib
-lrwxrwxrwx   1 root root     9 Mar  1 02:07 lib32 -> usr/lib32
-lrwxrwxrwx   1 root root     9 Mar  1 02:07 lib64 -> usr/lib64
-lrwxrwxrwx   1 root root    10 Mar  1 02:07 libx32 -> usr/libx32
 drwx------   2 root root 16384 Mar  1 02:10 lost+found
 drwxr-xr-x   2 root root  4096 Mar  1 02:07 media
 drwxr-xr-x   2 root root  4096 Mar  1 02:07 mnt
@@ -22,3 +18,4 @@
 drwxrwxrwt  12 root root  4096 Mar 31 05:26 tmp
 drwxr-xr-x  14 root root  4096 Mar  1 02:07 usr
 drwxr-xr-x  14 root root  4096 Mar 16 02:30 var
+---diff command test

깃허브에서 보여주는 방식과 유사하게 두 파일의 차이점을 보여준다.

@@ -<첫 번째 파일의 시작 행>,<시작행으로 부터 출력된 행의 수> +<두번째 파일의 시작 행><시작 행으로 부터 출력된 행의 수> @@

@@ -1,13 +1,9 @@

-> 첫 번째 파일의  1 행 부터 시작해서  13 개의 행을 출력

-> 두 번째 파일의  1 행 부터 시작해서  9 개의 행을 출력

 

cut : 입력의 일부를 추출하여 출력하는 명령어, tr: 문자 치환과 삭제

cut

$ cut -d <구분자> -f <필드 번호> [<파일 이름>]

 

<구분자>로 지정한 문자를 기준으로 입력 데이터를 분할하여 그중에서 <필드 번호> 로 지정한 필드만 출력

(ex) cut -d , -f 3 file.csv  :: 구분자 , 를 기준으로 분할하여 3 번째 필드만 출력

 

실전

$ cat etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
$ cut -d : -f 7 /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
....

 

응용

$ cut -d : -f 1,6,7 /etc/passwd
root:/root:/bin/bash
daemon:/usr/sbin:/usr/sbin/nologin
bin:/bin:/usr/sbin/nologin
..

tr

표준 입력을 읽고 주어면 명령어에 따라 문자를 치환

파일을 지정불가 

 

문자 치환

$ tr <치환 전 문자> <치환 후 문자>

 

$ cat /etc/passwd | tr : ,       # : -> ,
$ cat /etc/passwd | tr adc ABC   # a->A, b->B, c->C
$ cat /etc/passwd | tr a-z A-Z   # 소문자를 대문자로 치환

 

 

문자 삭제

tr -d <삭제할 문자>
$ cat /etc/passwd | tr -d "\n"

+ Recent posts