유닉스 이론과 실습

chap11. 유닉스 유틸리티 이용하기

leehyeon-dv 2024. 12. 8. 20:11

✨목차

1. 파일정보 수집 : wc

2. 파일정렬 : sort

3. 파일 분할 : split

4. 중복 삭제 :uniq

5. 필드 잘라내기 : cut

6. 두 파일 연결하기 : paste 

7. 파일 덤프 : dd

 


✏️파일 정보 수집 : wc 

  • 파일의 단어, 라인, 문자 수를 세는 명령어
  • 연상 : word count
-c 바이트 수
-m 문자수
-C -m과 동일
-l 라인 수 
-w 화이트 스페이스나 새로운 행으로 구분된 단어 수 
$ ls -l > test_wc      //디렉토리 파일 정보의 출력결과를 test_wc로 저장
$ cat test_wc          //파일 내용 출력
total 5
-rw-r--r-- 1 user1 staff 189 4월 29 21:14 h.txt
-rw-r--r-- 1 user1 staff 189 4월 29 21:14 s.txt
-rw-r--r-- 1 user1 staff 0 4월 29 21:16 test_wc

$ wc test_wc           //파일의 행수, 단어수, 바이트 수 출력
4 29 193 test_wc       //4줄, 29단어, 193크기 바이트

$wc -c test_wc        //바이트 수만 출력
193 test_wc

$wc -m test_wc        //문자 수 출력
187 test_wc

 

✏️파일 정렬 : sort

  • 텍스트 파일의 내용을 지정한 방법으로 정렬
  • 환경변수
    • LC_COLLATE :정렬순서 결정, 언어/지역에 따라 정렬방식이 달라짐
    • LANG : LC_COLLATE가 설정되지 않은 경우 기본 언어 환경에 따라 정렬
      • 유니코드( 공백 → 특수문자 → 숫자 → 영문자)
      • 아스키 코드( 공백 → 숫자 → 영문소문자 → 영문 대문자, 특수 문자는 사이사이)
-b 앞 부분 공백 무시 후 정렬
[blank]
-c 정렬이 되지 않은 상태로 출력
[check]
-d 사전 순으로 정렬
[dictionary]
-r 역순으로 정렬
[reverse]
-f 대소문자 구분 없이 정렬 -u 중복행 제거 후 정렬
[unique]
-k # #필드 기준으로 정렬
[key]
-t문자 필드 구분자 지정해 정렬
[tab]
-m 정렬된 파일 통합
[merge]
+번호 번호 +1 필드를 기준으로 정렬
-n  숫자를 산술값으로 정렬
[number]
+pos1
-pos2
정렬하고자하는 필드를 지정
pos1 열부터 pos2 열까지 정렬
-o 정렬 결과를 파일에 저장
[output 파일]
   

※[ ]안의 값은 그냥 연상 도움용이므로 아무 의미 없음

 

📝예시 (기본데이터 test_sort1)

$ cat test_sort1
This is a test_sort1 file.   //test_sort1파일의 내용
1234
                             //공백행
unix
Unix
_love
~love
!abc
 700                         //첫 문자는 공백
50
@@
#include
love
^love
                             //공백 행
<love>
`love`
hi
&987
 abcd                        //첫문자는 공백
{love
가나다

 

📝 기본정렬( 아스키코드 기준)

$ sort test_sort1
                           //공백 행
                           //공백 행
 700                       //첫 문자가 공백
 abcd                      //첫 문자가 공백
!abc                       //특수문자
#include
&987
1234                       //숫자
50
<love>                     //숫자와 대문자 사이에 나오는 특수문자
@@
This is a test_sort1 file. //대문자
Unix
^love                       //대문자와 소문자 사이의 특수문자
_love
`love`
hi                          //소문자
love
unix
{love                        //소문자 다음의 특수문자
~love
가나다

 

📝 (-d 정렬) 

$ sort -d test_sort1     //공백, 숫자, 영문자만 고려(특수문자, 대문자 무시)
                         //공백 행
                         //공백 행
@@                       //@는 무시하고 _로 정렬
 700                     // 첫 문자가 공백 문자 
 abcd                    
1234                     // 숫자
50                       
&987                     //'&'는 무시하고 숫자 987
!abc                     //'!'는 무시하고 abc 영어
hi                       // 
#include                 
_love                   
`love`                   
^love                    
<love>                   
love                     
Love                     // 대문자
This is a test_sort1 file. 
unix                    
Unix                     
가나다                    // 다국어 문자 (아스키코드 이후로 처리)

 

📝 (-r 정렬) 

$ sort -r test_sort1
가나다
Unix
unix
This is a test_sort1 file.
love
hi
50
1234
~love
<love>
^love
`love`
_love
#include
&987
@@
{Love
!abc
 abcd
 700
                             //공백 행
                             //공백 행

 

📝기본데이터(test_sort2)

$cat test_sort2
// 1번째 필드: 번호, 2번째 필드: 이름, 3번째 필드: 나이, 4번째 필드: 성별
001 Hong Gil-Dong 80 M      
002 Park Ji-Soo 100 M
003 Lee Na-Young 54 F
004 Kim Chan-Sook 60 F
005 Han Ji-Soo 75 M
006 Jung Doo-Ri 49 F
007 Lee Mi-Ra 59 F

 

📝 (+번호 , -k)

$ sort +1 test_sort2

005 Han Ji-Soo 75 M         // 이름 "Han Ji-Soo"를 기준으로 정렬
001 Hong Gil-Dong 80 M      // 이름 "Hong Gil-Dong"이 두 번째로 옴
006 Jung Doo-Ri 49 F        // 이름 "Jung Doo-Ri"가 정렬 순서상 세 번째
004 Kim Chan-Sook 60 F
007 Lee Mi-Ra 59 F
003 Lee Na-Young 54 F
002 Park Ji-Soo 100 M

 

$ sort -k 2 test_sort2

005 Han Ji-Soo 75 M         // 이름 "Han Ji-Soo"를 기준으로 정렬
001 Hong Gil-Dong 80 M      // 이름 "Hong Gil-Dong"이 두 번째로 옴
006 Jung Doo-Ri 49 F        // 이름 "Jung Doo-Ri"가 정렬 순서상 세 번째
004 Kim Chan-Sook 60 F
007 Lee Mi-Ra 59 F
003 Lee Na-Young 54 F
002 Park Ji-Soo 100 M

 

📝(+pos1 -pos2)

$ sort +1 -2 test_sort2

005 Han Ji-Soo 75 M        // 두 번째 필드(이름)를 기준으로 정렬
001 Hong Gil-Dong 80 M     // 두 번째 필드(이름)가 알파벳순으로 뒤따름
006 Jung Doo-Ri 49 F       // 이름 "Jung Doo-Ri"가 정렬 순서상 세 번째
004 Kim Chan-Sook 60 F
003 Lee Na-Young 54 F
007 Lee Mi-Ra 59 F
002 Park Ji-Soo 100 M

두번째 필드에서 정렬 시작해 세번째 필드 이전까지만 기준으로 정렬

 

$ sort -k 4 test_sort2

006 Jung Doo-Ri 49 F
003 Lee Na-Young 54 F
007 Lee Mi-Ra 59 F
004 Kim Chan-Sook 60 F
002 Park Ji-Soo 100 M     
005 Han Ji-Soo 75 M
001 Hong Gil-Dong 80 M

 

$sort -n -k 4 test_sort2

006 Jung Doo-Ri 49 F
003 Lee Na-Young 54 F
007 Lee Mi-Ra 59 F
004 Kim Chan-Sook 60 F
005 Han Ji-Soo 75 M
001 Hong Gil-Dong 80 M
002 Park Ji-Soo 100 M

 

 

$ sort +2 -3 +1 -2 test_sort2

004 Kim Chan-Sook 60 F
006 Jung Doo-Ri 49 F
001 Hong Gil-Dong 80 M
005 Han Ji-Soo 75 M
002 Park Ji-Soo 100 M
007 Lee Mi-Ra 59 F
003 Lee Na-Young 54 F

세번째 ( 나이 )를 기준으로 정렬, 네번째 전까지 정렬

나이가 같은 경우 두번째(이름)을 기준으로 세번째 까지 정렬

$ sort -n +3 -4 -o sort.out test_sort2

006 Jung Doo-Ri 49 F
003 Lee Na-Young 54 F
007 Lee Mi-Ra 59 F
004 Kim Chan-Sook 60 F
005 Han Ji-Soo 75 M
001 Hong Gil-Dong 80 M
002 Park Ji-Soo 100 M

 

숫자를 정렬한다 네번째를 기준으로 정렬, 5번째 까지 정렬

정렬 결과를 sort.out파일에 저장한다

 

📝 (-t 정렬)

$ sort -t : /etc/passwd   //:가 구분자로 지정

_polkitd:x:63:12:Polkit authorization daemon:/:/sbin/nologin
adm:x:4:4:Admin:/var/adm:/bin/sh
aiuser:x:61:61:AI User:/:/sbin/nologin
user1:x:100:10:user1:/export/home/user1:/usr/bin/bash
zfsnap:x:51:12:ZFS Automatic Snapshots Reserved UID:/:/usr/bin/pfsh

 

✏️파일 분할 : split

  • 큰 파일은 일정한 크기의 여러개 작은 파일로 분할
  • 분할된 파일은 xaa,xab 순으로 생성
  • 파일을 지정하지 않으면 표준입력 내용을 분할 저장
-b n 크기가 n 바이트인 파일로 분할
-n n 줄씩 분할
옵션을 지정하지 않으면 표준 입력 내용을 분할 저장

 

📝 기본 데이터 : test_split

$ cp /etc/services test_split
$ wc -l test_split
137 test_split

 

  행을 기준으로 파일 분할

$ split -30 test_split
$ wc -l x*

30 xaa
30 xab
30 xac
30 xad
17 xae
137 total

 

📝 바이트를 기준으로 파일 분할

$ wc -c test_split
4739 test_split

$ rm xa*
$ split -b 512 test_split  //바이트 기준으로 분할
$ wc -c x*
512 xaa
512 xab
512 xac
512 xad
512 xae
512 xaf
512 xag
512 xah
512 xai
131 xai
4739 total

 

🖥️ 실습!

$ pwd
/export/home/user1/Unix/ch11
$ mkdir Practice

$ cp /etc/group Practice
$ cp Practice
$ sort -o  groupA group
$ more groupA

$ wc -l groupA
27 groupA

$ split -9 groupA
$ wc -l xa*
9 xaa
9 xab
9 xac
27 total

$ ch ..
$ pwd
/export/home/user1/Unix/ch11

 

 

✏️중복제거 : uniq

  • 중복된 것을 업애고 고유하게 만든다 
  • 파일을 지정하지 않으면 표준입력내용을 처리
  • 입출력 파일 이름은 달라야함
-c 각 행의 처음에 중복 횟수를 출력 [count]
-d 중복된 행 중 한 행만 출력, 원래 유일한 행은 출력 안 함 [duplicates]
-u 중복되지 않는 행만 출력 [unique]

 

📝 기본데이터( test_uniq)

aaaaa
abcde
abcde
bbbbb
abcde
bbbbb
bbbbb
abcde
ccc

 

📝 중복 제거

$ uniq test_uniq

aaaaa
abcde
bbbbb
abcde
bbbbb
abcde
ccc

 

📝 정렬과 중복 제거를 동시에

$ sort test_uniq

aaaaa
abcde
abcde
abcde
abcde
bbbbb
bbbbb
bbbbb
ccc
$ sort test_uniq | uniq

aaaaa
abcde
bbbbb
ccc

 

 

📝 중복 없는 행 보기

$ uniq -u test
aaaaa
ccc

 

  • 중복 행(-d)
$ uniq -d test_uniq
abcde
bbbbb
  • 중복 횟수(-c)
$ uniq -c test_uniq
1 aaaaa
4 abcde
3 bbbbb
1 ccc

 

 

✏️필드 잘라내기 : cut

  • 데이터를 자른다!
-c 리스트 각 행에서 잘라낼 문자 위치 지정 [character]
-f 필드번호 지정한 필드 잘라냄 [field]
-d 문자 필드 구분자

 

📝 기본 데이터( test_cut)

001 Hong Gil-Dong 80 M
002 Park Ji-Soo 100 M
003 Lee Na-Young 54 F
004 Kim Chan-Sook 60 F
005 Han Ju-Hyun 75 M
006 Jyun Doo-Ri 49 F
007 Lee Mi-Ra 59 F

 

📝 문자 추출(-c), 필드 추출(-f), 필드 구분자 지정하기(-d)

$ cut -c 5-8 test_cut

Hong
Park
Lee
Kim
Han
Jyun
Lee
$ cut -f 2,3 test_cut

Hong    Gil-Dong
Park    Ji-Soo
Lee     Na-Young
Kim     Chan-Sook
Han     Ju-Hyun
Jyun    Doo-Ri
Lee     Mi-Ra

 

//첫번째 예제 
$ cut -d: -f1 /etc/passwd | more

root
daemon
bin
sys
adm
dladm
netadm
...

//두번째 예제 
$ cut -d' ' -f 2 test_sort2
Hong
Park
Lee
Kim
Han
Jung
Lee

 

✏️두 파일 연결하기 : paste

  • 지정한 파일의 내용을 붙임
  • 사용자가 지정한 두 개 이상의 파일 내용 중 같은 줄을 붙이거나 한 파일의 끝에 다른 파일의 내용을 추가
-s 파일의 끝에 추가 (split로 나눈 파일을 원래대로 붙일때)
-d문자 필드구분자
- 파일 대신 표준 입력 사용

 

📝기본데이터(test_paste1)

001
002
003
004
005
006
007

(test_paste2)

Hong Gil-Dong
Park Ji-Soo
Lee Na-Young
Kim Chan-Sook
Han Ju-Hyun
Jyun Doo-Ri
Lee Mi-Ra

 

📝파일  붙이기 

$ paste test_paste2 test_paste1

Hong Gil-Dong   001
Park Ji-Soo     002
Lee Na-Young    003
Kim Chan-Sook   004
Han Ju-Hyun     005
Jyun Doo-Ri     006
Lee Mi-Ra       007

 

📝 두 파일의 행이 같지 않은 경우

예시 파일( test_paste3)

001 002 003 004

005 006 007

$ paste test_paste2 test_paste3

Hong Gil-Dong   001 002 003 004
Park Ji-Soo     005 006 007
Lee Na-Young    
Kim Chan-Sook   
Han Ji-Soo      
Jung Doo-Ri     
Lee Mi-Ra

 

//필드 구분자 지정 : -d
$ paste -d: test_paste1 test_paste2

001:Hong Gil-Dong
002:Park Ji-Soo
003:Lee Na-Young
004:Kim Chan-Sook
005:Han Ju-Soo
006:Jung Doo-Ri
007:Lee Mi-Ra

//파일 수평 붙이기: -s
$ paste -s test_paste1 
001 002 003 004 005 006 007

$ paste -s test_paste1 test_paste2
001 002 003 004 005 006 007
Hong Gil-Dong Park Ji-Soo Lee Na-Young Kim Chan-Sook Han Ju-Soo Jung Doo-Ri Lee Mi-Ra

 

🖥️ 실습 ( 파일에서 필드 추출하고 파일 합치기)

$ cd Practice
$ ls
group groupA xaa xab xac
$ cat xaa
adm::4:daemon,root
aiuser::61:
bin::2:daemon,root
daemon::12:root
dialout::13:
ftp::21:
games::20:
gdm::50:
lp::8:adm,root

$ cut -d: -f 1 xaa > xa1 //xaa에서 첫번째 필드 추출 후 xa1에추가 
$ cut -d: -f 1 xab > xa2 //xab에서 ..
$ cut -d: -f 1 xac > xa3 //xac에서 ..
$ cat xa1
adm
aiuser
bin
daemon
dialout
ftp
games
gdm
lp
//파일 합치기
$ paste xa1 xa2 xa3 > xA
$ cat xA
adm     mail    root
aiuser  mlocate smmtp
bin     netadm  sshd
daemon  noaccess staff
dialout nogroup sys
ftp     openldap sysadmin
games   other    tty
gdm     pkg5srv  unknown
lp      webservd

//필드 추출
$ cut -d: -f 3 xaa > xg1
$ cat xg1
$ cat xg1
4 
61
2
12
13
21
20
50
8
//파일 합치기
$ paste xa1 xg1 > xB
$ cat xB
adm     4
aiuser  61
bin     2
daemon  12
dialout 13
ftp     21
games   20
gdm     50
lp      8
$ paste -s xa1 xa2 xa3 > xC
$ cat xC
adm aiuser bin daemon dialout ftp games gdm lp
mail mlocate netadm noaccess nobody nogroup openldap other pkg5srv
root smmsp sshd staff sys sysadmin tty unknown webservd

 

🖥️실습(2) 유닉스 시스템 사용자 목록 만들기

$ pwd
/export/home/user1/Unix/ch11/Practice

//필드추출
$ more /etc/passwd

$ cut -f 1 -d: /etc/passwd > login_list
$ cut -f 5 -d: /etc/passwd > name_list
$ more login_list
root:x:0:0:Super-User:/root:/usr/bin/bash
nobody:x:60001:60001:NFS Anonymous Access User:/:/bin/sh
...


$ more login_list
root
daemon
bin
sys
adm
..

$ more name_list
Super-User

$ paste -d: name_list login_list > user_list
$ more user_list 
Super-User:root
:daemon
:bin
:sys
...

//정렬하기
$ sort -o user_list user_list
$ more user_list
:bin
:daemon
:sys

 

✏️데이더 복사 : dd

  • 지정한 입력 파일을 지정한 옵션에 따라 변환하여 출력파일로 저장
bs=n 입출력 블록의 크기를 n바이트로 지정(기본 1블록 = 512바이트)
conv=lcase 알파벳을 소문자로 변환
conv=ucase 알파벡을 대문자로 변환

 

📝대소문자 전환하기 

$ cat test_cut
001 Hong Gil-Dong 80 M
002 Park Ji-Soo 100 M
...

$ dd conv=lcase if=test_cut of=test_dd1  //데이터를 소문자로 변환 test_cut파일을 test_ddi에 출력
@+1 records in
@+1 records out

$ cat test_dd1
001 hong gil-dong 80 m
002 park ji-soo 100 m
...

 

📝 파일 내용 지우기

$ dd if=/dev/null of=test_dd2
@+@ records in
@+@ records out 

$ cat test_dd2
$ ls -l test_dd2
-rw-r--r-- 1 user1 staff 0 may 2 19:59 test_dd2

 

 


✏️연습문제

1. /etc/passwd 파일의 네번째 필드를 첫번째 기준으로 하고, 첫번째 필드를 두번째 기준으로 해 정렬하는것은?

$ sort -t +3 -4 +0 -1 /etc/passwd

 

2. /etc/passwd파일에서 사용자의 이름만 뽑아서 test_user라는 이름의 파일로 저장

                                         (첫번째 필드)

cut -d: -f 1 /etc/passwd > test_user

 

3. /etc/passwd 파일에서 사용자의 쉘 정보만 뽑아서 test_shell이라는 이름의 파일로 저장

                                                      (7번째 필드)           

cut -d: -f 7 /etc/passwd > test_shell

 

4. 2,3번에서 생성한 파일의 내용을 필드로 합쳐서 새로운 test_user_shell이라는 이름의 파일로 저장

paste test_user test_shell > test_user_shell

 

5. test_user_shell 파일을 5행 단위로 나누기

split -5 test_user_shell

 

6. /etc/passwd 파일에서 로그인 id 와 쉘 정보만 추출하고 이 중 로그인 쉘을 가진 로그인 id와 로그인 쉘이 지정되지 않은 사용자로 구분해정렬

cut -d: -f 1,7 /etc/passwd > name_list

sort -t: -r -k 2 name_list > list

 

7. 현재 시스템에 접속중인 사용자 수를 알아보려한다 

     본문에서는 who 명령과 wc 명령을 결합하여 접속중인 사용자 수를 알아봤는데 한 사용자가 두개의 다른 창을 이용해         접속하면 who 명령의 실행결과 해당 이름이 2번 나오게 된다. 이 중복을 제거해 시스템에 접속 중인 순수 사용자의 수       를 알아내려면 어떻게 해야할까

 

who | sort | uniq | wc -l

 

8. test_sort2 파일을 정렬한 결과가 다음과 같다 sort 명령에서 지정한 옵션은 ? 

$ sort [ ] test_sort2

006 Jung Doo-Ri 49 F
003 Lee Na-Young 54 F
007 Lee Mi-Ra 59 F
004 Kim Chan-Sook 60 F
005 Han Ji-Soo 75 M
001 Hong Gil-Dong 80 M
002 Park Ji-Soo 100 M

 

sort +4 -5 +1 -2 test_sort2

 

9. /etc/passwd 파일에서 GID를 추출해 중복된 GID를 제거하고 번호 순서대로 정렬하는 명령

                                    (4번째 필드) 

cut -d: -f 4 /etc/passwd > name1

sort -n name1 | uniq > name2

 

10. 9번에서 추출한 GID중에서 가장 많은 계정에 등록된 GID가 무엇인지 알 수 있는 명령 파일내용을 직접보지 않고 명령을 사용해 알아내야함

sort name1 | uniq -c | sort -r  

                   (uniq -c : 각 행 처음에 중복 횟수를 출력,  sort -r : 역순으로 정렬)

11. /etc/group 파일에는 그룹에 속한 멤버가 사용자가 있는 그룹들이 있다 

      이렇게 멤버가 있는 그룹을 상단으로 오게 정렬하기

 

sort +3 -4 -r -t: /etc/group > member

 

12. dd 명령의 man 페이지를 참조해 위에서 생성한 test_user 파일의 내용을 EBCDID코드로 변환해 test_user2이름으로 저장

dd conv=ebcdic  if=test_user of= test_user2