답변:
두 줄의 가장 큰 차이점은 입력에 따라 다릅니다. cut
단일 문자를 -d
필드 구분 기호로 사용하고 (기본값은 TAB) 해당 문자가 나타날 때마다 새 필드가 시작됩니다. awk
그러나 더 유연합니다. 구분 기호는 FS
변수에 있으며 빈 문자열 (입력 문자마다 별도의 필드를 만듭니다), 단일 문자 또는 정규식 일 수 있습니다. 단일 공백 문자 (기본값)의 특수한 경우는 일련 의 공백 문자 로 분할되는 것을 의미합니다 . 또한,awk
기본적으로 선행 공백을 억제합니다.
다음을 비교하십시오 :
$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc def" | cut -f 2 -d ' '
$ echo " abc def" | cut -f 2 -d ' '
abc
$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def
여기서, awk
사이 공간의 시퀀스를 분할 abc
하고 def
, 반면cut
세퍼레이터와 같은 모든 공간 걸린다.
당신이 취하는 것은 당신이 달성하고자하는 것에 달려 있습니다. 그렇지 않으면 cut
작고 단일 목적의 도구이지만 awk
자체 프로그래밍 언어 가 있기 때문에 더 빠를 것으로 예상 됩니다.
cut
Awk 단독 보다 빠를 것 같지만 grep ... | cut
순수한 Awk보다 빠를지는 확실하지 않습니다 .
일반적으로 도구가 전문화 될수록 더 빠릅니다. 그래서 대부분의 경우에, 당신은 기대할 수 있습니다 cut
및 grep
보다 빠른 것으로 sed
, 그리고 sed
보다 빠른 것으로awk
. 더 복잡한 도구를 한 번만 호출하여 더 간단한 도구의 더 긴 파이프 라인을 비교하는 경우에는 경험이 없습니다. 이것은 큰 입력 (예 : 수백만 줄)에서만 중요합니다. 짧은 입력의 경우 아무런 차이가 없습니다.
더 복잡한 도구의 장점은 물론 더 많은 일을 할 수 있다는 것입니다.
당신의 명령은 고양이를 불필요하게 사용합니다. 대신 리디렉션을 사용하십시오 (특히 속도가 걱정되는 경우 벤치 마크를 실행할 때까지 속도에 대해 걱정하지 않아야합니다 ¹).
<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '
이 명령은 거의 동일합니다. 차이점은 다음과 같습니다.
grep -E
거의 동일한 정규 표현식 구문이 있습니다 (확장 정규 표현식).cut -d ' '
각 개별 공백 문자를 구분 기호로 취급합니다. Awk의 기본 구분 기호는 공백, 탭 등의 공백 시퀀스 일 수 있습니다. 임의의 공백 시퀀스를로 구분 기호로 사용할 수 없습니다 cut
. awk에서 개별 공백을 구분 기호로 사용하려면 단일 공백으로 구성된 정규 표현식 이외의 단일 공백과 일치하는 정규 표현식으로 필드 구분 기호를 설정하십시오 (예 : "임의의 공백 시퀀스"를 의미하는 특수한 경우, 즉 기본값) : awk -F '[ ]' '/WORD/ {print $2}'
.¹ 프로그램 최적화의 첫 번째 규칙 :하지 마십시오. 프로그램 최적화의 두 번째 규칙 (전문가에게만 해당) : 아직하지 마십시오. — 마이클 에이 잭슨
당신의 명령,
cat fileName | awk '/WORD/ { print $2 }'
당신은 cat
명령이 필요하지 않습니다 . 당신은 시도 할 수 있습니다
awk '/WORD/ { print $2 }' filename
그리고 아래 명령은 cat에서 grep으로 출력을 리디렉션 한 다음 잘라냅니다.
cat fileName | grep WORD | cut -f 2 -d ' '
아마도 출력 리디렉션을 피해야합니다. Awk는 한 줄로 작업을 수행하지만 특정 단어를 포함하는 줄만 가져 오려면 명령이 cut
필요하며 grep
구분 기호 공간에 따라 열 2를 인쇄합니다.
컷이 실패하면 awk로 할 수 있습니다.
grep WORD filename
.
echo filename
또는cat filename
?