grep으로 awk와 cut의 정확한 차이점은 무엇입니까? [닫은]


30

다음 두 기술을 사용하여 파일에서 원하는 행의 두 번째 열을 얻을 수 있음을 알고 있습니다.

awk '/WORD/ { print $2 }' filename

또는

grep WORD filename| cut -f 2 -d ' '

내 질문은 :

  • 위의 두 명령의 차이점은 무엇입니까?
  • 어느 것이 최고의 성능을 발휘합니까?
  • awkover over를 사용 하는 것의 장점은 무엇입니까 cut?
  • awk우리에게 어떤 옵션을 제공 cut합니까?

echo filename또는 cat filename?
Avinash Raj

@AvinashRaj 죄송합니다 편집
Networker

답변:


35

두 줄의 가장 큰 차이점은 입력에 따라 다릅니다. 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자체 프로그래밍 언어 가 있기 때문에 더 빠를 것으로 예상 됩니다.


내가 대답으로 원하는 @Dubu 대답으로, 덕분에 나는 질문을 표시 할 것
Networker를

1
cutAwk 단독 보다 빠를 것 같지만 grep ... | cut순수한 Awk보다 빠를지는 확실하지 않습니다 .
와일드 카드

8

일반적으로 도구가 전문화 될수록 더 빠릅니다. 그래서 대부분의 경우에, 당신은 기대할 수 있습니다 cutgrep보다 빠른 것으로 sed, 그리고 sed보다 빠른 것으로awk . 더 복잡한 도구를 한 번만 호출하여 더 간단한 도구의 더 긴 파이프 라인을 비교하는 경우에는 경험이 없습니다. 이것은 큰 입력 (예 : 수백만 줄)에서만 중요합니다. 짧은 입력의 경우 아무런 차이가 없습니다.

더 복잡한 도구의 장점은 물론 더 많은 일을 할 수 있다는 것입니다.

당신의 명령은 고양이를 불필요하게 사용합니다. 대신 리디렉션을 사용하십시오 (특히 속도가 걱정되는 경우 벤치 마크를 실행할 때까지 속도에 대해 걱정하지 않아야합니다 ¹).

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

이 명령은 거의 동일합니다. 차이점은 다음과 같습니다.

  • awk와 grep은 다른 regexp 구문을 가지고 있습니다 . Awk와 grep -E거의 동일한 정규 표현식 구문이 있습니다 (확장 정규 표현식).
  • cut -d ' '각 개별 공백 문자를 구분 기호로 취급합니다. Awk의 기본 구분 기호는 공백, 탭 등의 공백 시퀀스 일 수 있습니다. 임의의 공백 시퀀스를로 구분 기호로 사용할 수 없습니다 cut. awk에서 개별 공백을 구분 기호로 사용하려면 단일 공백으로 구성된 정규 표현식 이외의 단일 공백과 일치하는 정규 표현식으로 필드 구분 기호를 설정하십시오 (예 : "임의의 공백 시퀀스"를 의미하는 특수한 경우, 즉 기본값) : awk -F '[ ]' '/WORD/ {print $2}'.

¹ 프로그램 최적화의 첫 번째 규칙 :하지 마십시오. 프로그램 최적화의 두 번째 규칙 (전문가에게만 해당) : 아직하지 마십시오. 마이클 에이 잭슨


1

당신의 명령,

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로 할 수 있습니다.


3
ps grep에 cat 명령이 필요하지 않습니다. 당신은 할 수 있습니다 grep WORD filename.
phoops

@ edvinas.me p.
Avinash Raj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.