셸 스 크 립 트 학습 - 11 (cut 명령 학습)

[본문 시작!]
컷 명령 을 한두 마디 로 설명해 주세요!
이름 그대로 컷 의 작업 은 '자 르 기' 입 니 다. 구체 적 으로 파일 에서 데 이 터 를 자 르 는 일 을 맡 고 있 습 니 다.
cut 는 모든 행위 의 처리 대상 으로 이 메커니즘 은 sed 와 같다.(sed 에 관 한 입문 글 은 가 까 운 시일 내 에 발 표 됩 니 다)
2 컷 은 일반적으로 무엇 을 근거 로 합 니까?그 러 니까 내 가 컷 에 게 내 가 찾 고 싶 은 커팅 내용 을 어떻게 알려 줄 까?
cut 명령 은 주로 세 가지 포 지 셔 닝 방법 을 받 습 니 다.
첫째, 바이트 (bytes), 옵션 - b
둘째, 문자 (characters), 옵션 - c
셋째, 필드 (fields), 옵션 - f
3. '바이트' 로 포 지 셔 닝 하여 가장 간단 한 예 를 드릴 까요?
예 를 들 어 ps 명령 을 실행 할 때 다음 과 같은 내용 을 출력 합 니 다.
[rocrocket@rocrocket programming]$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)

만약 우리 가 각 줄 의 세 번 째 바이트 를 추출 하고 싶다 면, 이렇게 하 십시오.
[rocrocket@rocrocket programming]$ who|cut -b 3
c
c
c

알 겠 죠? - b 뒤에 어떤 바이트 를 추출 할 지 설정 할 수 있 습 니 다. 사실 - b 와 3 사이 에 빈 칸 이 없어 도 되 지만 빈 칸 이 있 는 것 을 추천 합 니 다.)
4 만약 에 '바이트' 포 지 셔 닝 에서 3 번, 4 번, 5 번, 8 번 바 이 트 를 추출 하려 면 어떻게 해 야 합 니까?
- b 지원 형 은 3 - 5 와 같은 쓰기 이 고 여러 개의 포 지 셔 닝 사 이 를 쉼표 로 구분 하면 됩 니 다.예 를 들 어 보 자.
[rocrocket@rocrocket programming]$ who|cut -b 3-5,8
croe
croe
croe

그러나 한가지 주의해 야 할 것 은 컷 명령 이 - b 옵션 을 사용 하면 이 명령 을 실행 할 때 컷 은 - b 뒤의 모든 위 치 를 작은 것 에서 큰 것 으로 정렬 한 다음 에 추출 합 니 다.포 지 셔 닝 순 서 를 뒤 바 꾸 면 안 돼 요.이 예 는 이 문 제 를 설명 할 수 있다.
[rocrocket@rocrocket programming]$ who|cut -b 8,3-5
croe
croe
croe

5 또 어떤 '3 - 5' 와 같은 작은 기교 가 있 는 지 열거 해 보 세 요!
[rocrocket@rocrocket programming]$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)
[rocrocket@rocrocket programming]$ who|cut -b -3
roc
roc
roc
[rocrocket@rocrocket programming]$ who|cut -b 3-
crocket :0           2009-01-08 11:07
crocket pts/0        2009-01-08 11:23 (:0.0)
crocket pts/1        2009-01-08 14:15 (:0.0)

틀림없이 너 도 보 았 을 거 야. - 3 은 첫 번 째 바이트 에서 세 번 째 바이트 까지, 3 은 세 번 째 바이트 에서 줄 끝까지.만약 당신 이 세심 하 다 면, 당신 은 이 두 가지 상황 에서 모두 세 번 째 바이트 인 'c' 를 포함 하 는 것 을 볼 수 있 습 니 다.내 가 who | cut - b - 3, 3 을 실행 하면 어 떨 것 같 아?정 답 은 전체 줄 을 출력 하 는 것 입 니 다. 두 개의 겹 치 는 c 가 나타 나 지 않 습 니 다.보기:
[rocrocket@rocrocket programming]$ who|cut -b -3,3-
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)

6. 문 자 를 포 지 셔 닝 표지 로 하 는 가장 간단 한 예 를 주세요!
다음 예 를 들 어 당신 은 만난 적 이 있 는 것 같 습 니 다. 3 번, 4 번, 5 번 과 8 번 문 자 를 추출 합 니 다.
[rocrocket@rocrocket programming]$ who|cut -c 3-5,8
croe
croe
croe

그런데 어떻게 보면 - b 랑 다 를 게 없 지?설마 - b 와 - c 의 역할 이 같 습 니까?사실은 그렇지 않 습 니 다. 똑 같은 것 같 습 니 다. 다만 이 예 를 잘 들 지 못 해서 who 가 출력 한 것 은 모두 단일 바이트 문자 이기 때문에 - b 와 - c 로 차이 가 없습니다. 만약 에 중국 어 를 추출 하면 차이 점 을 알 수 있 습 니 다. 자, 중국어 추출 상황 을 보 세 요.
[rocrocket@rocrocket programming]$ cat cut_ch.txt
   
   
   
   
[rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt
�
�
�
�
[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt
 
 
 
 

보 셨 죠? - c 를 사용 하면 문자 단위 로 출력 이 정상 입 니 다.그리고 - b 는 바보 같이 바이트 (8 비트 바 이 너 리) 로 만 계산 하고 출력 은 어 지 러 운 코드 입 니 다.이 지식 점 을 언급 한 이상 한 마디 더 덧 붙 여 라. 만약 네가 배 울 여력 이 있다 면 좀 높 여 라.다 중 바이트 문 자 를 만 났 을 때 - n 옵션 을 사용 할 수 있 습 니 다. - n 은 cut 에 다 중 바이트 문 자 를 뜯 지 말 라 고 알려 줍 니 다.예 는 다음 과 같다.
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -b 2
�
�
�
�
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 2
 
[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 1,2,3
 
 
 
 

6 역 은 어떻게 된 거 죠?설명:)
왜 '도 메 인' 추출 이 있 습 니까? 방금 언급 한 - b 와 - c 는 고정 형식의 문서 에서 만 정 보 를 추출 할 수 있 고 고정 형식 이 아 닌 정보 에 대해 서 는 속수무책 이기 때 문 입 니 다.이때 '역' 이 도움 이 되 었 다.
(아래 설명 내용 은/etc/passwd 파일 의 내용 과 조직 형식 에 대해 잘 알 고 있다 고 가정 한 상태 에서 이 루어 집 니 다.)
만약/etc/passwd 파일 을 관찰 한 적 이 있다 면, who 의 출력 정보 처럼 고정된 형식 이 아니 라 비교적 흩 어 진 배출 임 을 발견 할 수 있 을 것 이다.그러나 짝 퉁 은 이 파일 의 모든 줄 에서 매우 중요 한 역할 을 하 는데 짝 퉁 은 모든 항목 을 분리 하 는 데 사용 된다.
우 리 는 운 이 좋게 도 cut 명령 은 이러한 추출 방식 을 제공 합 니 다. 구체 적 으로 말 하면 '간격 문자' 를 설정 하고 '몇 번 째 도 메 인 추출' 을 설정 하면 됩 니 다!
/etc/passwd 의 앞 다섯 줄 내용 을 예 로 들 면:
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp

보 셨 죠? - d 로 간격 부 호 를 콜론 으로 설정 하고 - f 로 제 가 찾 으 려 는 첫 번 째 도 메 인 을 설정 한 다음 에 리 턴 을 누 르 면 모든 사용자 이름 이 나 옵 니 다!허허, 성취 감 있 지?물론 - f 를 설정 할 때 도 3 - 5 또는 4 - 유사 한 형식 을 사용 할 수 있 습 니 다.
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7
root:0:0:root:/bin/bash
bin:1:1:bin:/sbin/nologin
daemon:2:2:daemon:/sbin/nologin
adm:3:4:adm:/sbin/nologin
lp:4:7:lp:/sbin/nologin
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f -2
root:x
bin:x
daemon:x
adm:x
lp:x

7 빈 칸 과 탭 문 자 를 만 났 을 때 어떻게 구분 합 니까?난 좀 복잡 한데 어 떡 하지?
어떤 때 는 탭 문자 가 확실히 식별 하기 어 려 울 때 가 있 는데, 한 단락 의 빈 칸 이 도대체 몇 개의 빈 칸 으로 구 성 된 것 인지, 아니면 하나의 탭 문자 로 구 성 된 것 인지 알 수 있 는 방법 이 있다.
[rocrocket@rocrocket programming]$ cat tab_space.txt
this is tab	finish.
this is several space      finish.
[rocrocket@rocrocket programming]$ sed -n l tab_space.txt
this is tab/tfinish.$
this is several space      finish.$

보 셨 죠? 탭 문자 (TAB) 라면/t 기호 로 표시 되 고 빈 칸 이면 그대로 표 시 됩 니 다.이 방법 을 통 해 탭 문자 와 빈 칸 을 판단 할 수 있 습 니 다.위의 sed - n 뒤의 문 자 는 L 의 소문 자 입 니 다. 잘못 보지 마 세 요.(알파벳 l, 숫자 1 그리고 연산 | 정말 구분 하기 어 려 운 데..............................................................
8. cut - d 에서 어떤 기호 로 맞 춤 형 표 나 빈 칸 을 설정 해 야 합 니까?
컷 의 - d 옵션 의 기본 간격 부 호 는 탭 문자 입 니 다. 따라서 탭 부 호 를 사용 하려 고 할 때 - d 옵션 을 생략 하고 - f 로 도 메 인 을 찾 으 면 됩 니 다!안심 해, 나 를 믿 어!간격 문자 로 빈 칸 을 설정 하면 다음 과 같 습 니 다.
[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1
this
this

주의해 라, 두 개의 작은 따옴표 사이 에는 확실히 빈 칸 이 있어 야 한다. 게 으 름 피 워 서 는 안 된다.그리고 - d 뒤에 만 빈 칸 을 설정 할 수 있 습 니 다. 여러 개의 빈 칸 을 설정 할 수 없습니다. cut 는 간격 문자 만 허용 하기 때 문 입 니 다.
[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d '  ' -f 1
cut: the delimiter must be a single character
Try `cut --help' for more information.

9. ps 와 cut 명령 을 함께 사용 하고 싶 을 때 왜 항상 마지막 두 줄 에 중복 현상 이 나타 납 니까?
이 문제 의 구체 적 인 묘 사 는 다음 과 같다.cut 와 ps 가 일치 할 때:
[rocrocket@rocrocket programming]$ ps
  PID TTY          TIME CMD
 2977 pts/0    00:00:00 bash
 5032 pts/0    00:00:00 ps
[rocrocket@rocrocket programming]$ ps|cut -b3
P
9
0
0

봐, 마지막 0 이 두 번 반복 됐어!!그리고 저도 ps ef 나 ps aux 를 시험 해 봤 는데 모두 이 문제 가 있 습 니 다.
ps 가 다른 명령 과 협조 할 때 모두 이 문제 가 없습니다. 예 를 들 어 cut 와 who 의 협 조 는 정상 입 니 다.
[rocrocket@rocrocket programming]$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)
[rocrocket@rocrocket programming]$ who|cut -b3
c
c
c

이상 하 게 보 이 는 이 문 제 는 아무리 생각해 도 풀 리 지 않 는 문제 로 sunway 의 해답 을 얻 었 습 니 다. 여기 서 그 에 게 감 사 드 립 니 다.내 가 질문 한 원본 주 소 는 [여기] 에 있다.사실 이 문 제 는 이 렇 습 니 다. ps | cut 은 자체 적 으로 프로 세 스 를 만 들 기 때문에 ps 시 에 도 이 프로 세 스 를 추출 한 다음 에 파 이 프 를 통 해 cut 로 출력 합 니 다. 그래서 cut 을 캡 처 한 후에 한 줄 이 더 생 겼 습 니 다. 이전 줄 의 내용 을 반복 하 는 이 유 는 우리 가 마침 이전 줄 과 같은 문 자 를 얻 었 기 때 문 입 니 다.ps 와 ps | cat 를 테스트 해 보면 그 이 유 를 알 수 있 습 니 다!:)
10 컷 은 어떤 결함 과 부족 함 이 있 습 니까?
알 아 맞 혔 죠?네, 멀 티 스페이스 바 를 처리 할 때 입 니 다.만약 파일 안의 일부 도 메 인 이 몇 개의 빈 칸 으로 간격 을 두 었 다 면, cut 를 사용 하 는 것 은 좀 번 거 로 울 것 입 니 다. cut 는 '한 글자 로 간격 을 두 는' 텍스트 내용 만 처리 하 는 데 능 하기 때 문 입 니 다.

좋은 웹페이지 즐겨찾기