✨목차
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
'유닉스 이론과 실습' 카테고리의 다른 글
chap6 .파일 접근 권한 관리하기 (0) | 2024.12.10 |
---|---|
chap7. 파일과 디렉토리 검색 (0) | 2024.12.09 |
chap 8. 프로세스와 사용자 명령 익히기 (0) | 2024.12.09 |
chap 9. 파일 아카이브와 압축 명령익히기 (0) | 2024.12.08 |
chap10. 인터넷과 통신 명령 익히기 (0) | 2024.12.08 |