수색…
소개
cut
명령은 텍스트 파일의 줄 부분을 빠르게 추출하는 방법입니다. 그것은 가장 오래된 유닉스 명령에 속한다. 가장 많이 사용되는 구현은 Linux에서 발견 된 GNU 버전과 MacOS에서 발견 된 FreeBSD 버전이지만 Unix의 각 특징은 고유합니다. 차이점은 아래를 참조하십시오. 입력 라인은 stdin
또는 명령 행에서 인수로 나열된 파일에서 읽습니다.
통사론
잘라 내기 -f1,3 # 첫 번째 및 세 번째 탭 구분 필드 추출 (stdin에서)
세번째 필드까지 처음부터 -f1-3 # 추출물 컷 (말단 포함)
cut -f-3 # -3은 1-3으로 해석됩니다.
cut -f2- # 2-는 두 번째에서 마지막으로 해석됩니다.
cut -c1-5,10 # stdin의 위치에서 1,2,3,4,5,10의 문자 를 추출합니다.
cut -s -f1 # 구분 기호를 포함하지 않는 행을 억제합니다.
cut --complement -f3 # (GNU cut only) 세번째 칸을 제외한 모든 칸을 추출 한다.
매개 변수
매개 변수 | 세부 |
---|---|
-f, --fields | 필드 기반 선택 |
-d, --delimiter | 필드 기반 선택을위한 구분 기호 |
-c, --characters | 문자 기반 선택, 구분 기호 무시 또는 오류 |
-s, - 단 - 구분 | 구분 기호 문자가없는 줄을 표시하지 않습니다 (그렇지 않으면 인쇄됩니다). |
--보어 | 반전 된 선택 (지정된 필드 / 문자를 제외하고 모두 추출 |
- 출력 구분 기호 | 입력 구분 기호와 다른 경우를 지정하십시오. |
비고
1. 구문의 차이점
위 표의 긴 옵션은 GNU 버전에서만 지원됩니다.
2. 어떤 캐릭터도 특별한 대우를받지 못한다.
FreeBSD cut
(예를 들어 MacOS와 함께 --complement
)에는 --complement
스위치가 없으며 문자 범위의 경우 colrm
명령을 대신 사용할 수 있습니다.
$ cut --complement -c3-5 <<<"123456789"
126789
$ colrm 3 5 <<<"123456789"
126789
그러나 colrm
은 TAB 문자 (ASCII 9)를 8의 다음 배수까지 실제 표로 취급하고 백 스페이스 (ASCII 8)를 -1 폭으로 취급하기 때문에 큰 차이가 있습니다. 반대로 cut
은 모든 문자를 하나의 열로 취급합니다.
$ colrm 3 8 <<<$'12\tABCDEF' # Input string has an embedded TAB
12ABCDEF
$ cut --complement -c3-8 <<<$'12\tABCDEF'
12F
3. (아직도 아니요) 국제화
cut
을 디자인 할 때 모든 문자는 1 바이트 길이 였고 국제화는 문제가되지 않았습니다. 보다 넓은 문자를 사용하는 시스템이 인기를 얻었을 때, POSIX가 채택한 해결책은 몇 바이트의 크기가 있더라도 문자 를 선택한다는 의미를 유지해야하는 이전의 -c
스위치를 사용하지 않고 새로운 스위치 -b
를 도입하는 것이 었습니다. 현재의 문자 인코딩 과 관계없이 바이트를 선택하십시오. 대부분의 대중적인 구현에서 -b
가 소개되고 작동하지만 -c
는 -b
와 똑같이 작동하고 있어야합니다. 예를 들어 GNU cut
:
SE의 스팸 필터는 격리 된 간지 문자로 영어 텍스트를 블랙리스트에 표시합니다. 나는이 한계를 극복하지 못했기 때문에 다음 예제는 표현할 수있는 것보다 덜 표현적이다.
# In an encoding where each character in the input string is three bytes wide,
# Selecting bytes 1-6 yields the first two characters (correct)
$ LC_ALL=ja_JP.UTF-8 cut -b1-6 kanji.utf-8.txt
...first two characters of each line...
# Selecting all three characters with the -c switch doesn’t work.
# It behaves like -b, contrary to documentation.
$ LC_ALL=ja_JP.UTF-8 cut -c1-3 kanji.utf-8.txt
...first character of each line...
# In this case, an illegal UTF-8 string is produced.
# The -n switch would prevent this, if implemented.
$ LC_ALL=ja_JP.UTF-8 cut -n -c2 kanji.utf-8.txt
...second byte, which is an illegal UTF-8 sequence...
문자가 ASCII 범위를 벗어나서 cut
을 사용하려면 인코딩에서 문자 너비를 항상 알고 있어야하고 그에 따라 -b
사용해야합니다. 문서화 된대로 -c
가 작동하기 시작하면, 스크립트를 변경할 필요가 없습니다.
4. 속도 비교
cut
의 한계는 사람들로 하여금 그 유용성을 의심하게 만든다. 사실, 더 강력하고 대중적인 유틸리티로 동일한 기능을 구현할 수 있습니다. 그러나 cut
의 장점은 성능 입니다. 몇 가지 속도 비교는 아래를 참조하십시오. test.txt
에는 3 개의 백만 줄이 있고 5 개의 공백으로 구분 된 입력란이 있습니다. awk
테스트의 경우 mawk
가 GNU awk
보다 빠르기 때문에 사용되었습니다. 셸 자체 (마지막 줄)는 훨씬 최악의 수행자입니다. 주어진 시간 (초)은 time
명령이 실시간으로 제공하는 시간 입니다.
(단지 오해를 피하기 위해 : 모든 테스트 된 명령은 주어진 입력으로 동일한 출력을 주었지만, 물론 필드가 동등하지 않고 여러 상황에서 다른 출력을 제공 할 수 있습니다. 특히 필드가 가변 수의 공백으로 구분 된 경우)
명령 | 시각 |
---|---|
cut -d ' ' -f1,2 test.txt | 1.138 초 |
awk '{print $1 $2}' test.txt | 1.688 초 |
join -a1 -o1.1,1.2 test.txt /dev/null | 1.767 초 |
perl -lane 'print "@F[1,2]"' test.txt | 11.390 초 |
grep -o '^\([^ ]*\) \([^ ]*\)' test.txt | 22.925 초 |
sed -e 's/^\([^ ]*\) \([^ ]*\).*$/\1 \2/' test.txt | 52.122 초 |
while read ab _; do echo $a $b; done <test.txt | 55.582 초 |
5. 참조 매뉴얼 페이지
기본 사용법
일반적인 사용법은 CSV 유형 파일로, 각 행은 -d
옵션으로 지정된 분리 문자로 구분 된 필드로 구성됩니다. 기본 구분 기호는 Tab 문자입니다. data.txt
와 같은 라인이있는 데이터 파일이 있다고 가정 해 보겠습니다.
0 0 755 1482941948.8024
102 33 4755 1240562224.3205
1003 1 644 1219943831.2367
그때
# extract the third space-delimited field
$ cut -d ' ' -f3 data.txt
755
4755
644
# extract the second dot-delimited field
$ cut -d. -f2 data.txt
8024
3205
2367
# extract the character range from the 20th through the 25th character
$ cut -c20-25 data.txt
948.80
056222
943831
보통 스위치와 매개 변수 사이에는 선택적 공백이있을 수 있습니다. -d,
는 -d ,
와 같으며 -d ,
GNU cut
은 --output-delimiter
옵션을 지정할 수 있습니다 : (이 예제의 독립된 특징은 쉘에 의한 특수 처리를 피하기 위해 입력 분리 문자로서 세미콜론을 이스케이프 처리해야한다는 것입니다)
$ cut --output-delimiter=, -d\; -f1,2 <<<"a;b;c;d"
a,b
하나의 구분 문자 만
하나 이상의 구분자를 사용할 수 없습니다 : -d ",;:"
와 같은 것을 지정하면, 일부 구현은 첫 번째 문자 만 구분 기호 (이 경우 쉼표)로 사용합니다. 다른 구현 (예 : GNU cut
)은 너에게 오류 메시지가있다.
$ cut -d ",;:" -f2 <<<"J.Smith,1 Main Road,cell:1234567890;land:4081234567"
cut: the delimiter must be a single character
Try `cut --help' for more information.
반복 된 구분 기호는 빈 필드로 해석됩니다.
$ cut -d, -f1,3 <<<"a,,b,c,d,e"
a,b
다소 명확하지만, 공백으로 구분 된 문자열을 사용하면
$ cut -d ' ' -f1,3 <<<"a b c d e"
a b
cut
은 쉘이나 다른 프로그램처럼 인수를 구문 분석하는 데 사용할 수 없습니다.
따옴표 없음
구분 기호를 보호 할 방법이 없습니다. 스프레드 시트 및 유사한 CSV 처리 소프트웨어는 대개 구분 기호가 포함 된 문자열을 정의 할 수있는 텍스트 인용 문자를 인식 할 수 있습니다. cut
안된다.
$ cut -d, -f3 <<<'John,Smith,"1, Main Street"'
"1
추출, 조작하지 않음
필드의 순서를 바꾸거나 반복하지 않고 선의 일부만 추출 할 수 있습니다.
$ cut -d, -f2,1 <<<'John,Smith,USA' ## Just like -f1,2
John,Smith
$ cut -d, -f2,2 <<<'John,Smith,USA' ## Just like -f2
Smith