awk와 cut, grep의 정확한 차이점은 무엇입니까? [폐쇄]

awk와 cut, grep의 정확한 차이점은 무엇입니까? [폐쇄]

우리는 이 두 가지 기술을 사용하여 파일에서 원하는 행의 두 번째 열을 가져올 수 있다는 것을 알고 있습니다.

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

또는

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

내 질문은 다음과 같습니다

  • 위의 두 명령의 차이점은 무엇입니까?
  • 어느 것이 가장 좋은 성능을 가지고 있습니까?
  • awk사용과 사용의 장점은 무엇이며 cut그 반대의 경우도 마찬가지입니까?
  • awk우리에게는 어떤 선택이 주어졌나요 cut? 그 반대도 마찬가지인가요?

답변1

두 라인 사이의 가장 중요한 차이점은 입력에 따라 다릅니다. 필드 구분 기호로 cut단일 문자를 사용하고 (기본값은 TAB) 이 문자가 나타날 때마다 새 필드가 시작됩니다. 그러나 더 유연합니다. 구분 기호는 변수에 있으며 빈 문자열(각 입력 문자가 별도의 필드를 형성함), 단일 문자 또는 정규 표현식일 수 있습니다. 단일 공백 ​​문자(기본값)의 특별한 경우는-dawkFS주문하다공백. 또한 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과 사이의 공백 순서를 기준으로 분할이 이루어지며, 각 공백은 구분 기호로 사용됩니다.abcdefcut

당신이 취하는 것은 당신이 달성하고자 하는 것에 달려 있습니다. 그렇지 않으면 cut더 작고 단일 목적의 도구이지만 awk자체 프로그래밍 언어가 있기 때문에 더 빠르기를 바랍니다 .

답변2

일반적으로 도구가 전문화될수록 속도는 빨라집니다. 따라서 대부분의 경우 합계가 합계보다 빠르며 합계보다 빠르며 합계 cut보다 빠르며 합계보다 빠르며 합계보다 빠릅니다 . 더 간단한 도구의 더 긴 파이프라인을 더 복잡한 도구의 단일 호출과 비교하는 경우 경험상 법칙이 없습니다. 이는 큰 입력(예: 수백만 행)에만 적합합니다. 짧은 입력의 경우 아무런 차이가 없습니다.grepsedsedawk

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

귀하의 명령은 불필요하게 cat을 사용합니다. 대신 리디렉션을 사용하십시오(특히 벤치마크를 실행하기 전에는 속도에 대해 걱정할 필요가 없지만 속도가 걱정되는 경우).

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

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

  • awk와 grep이 있습니다다양한 정규식 구문. awk와 grep -Eregexp는 거의 동일한 구문(확장 정규식)을 갖습니다.
  • cut -d ' '각 개별 공백 문자를 구분 기호로 처리합니다. awk의 기본 구분 기호는 여러 개의 공백, 탭 등이 될 수 있는 일련의 공백입니다. 임의의 공백 시퀀스를 구분 기호로 사용할 수 없습니다 cut. awk에서 단일 공백을 구분 기호로 사용하려면 단일 공백으로 구성된 정규 표현식이 아닌 단일 공백과 일치하는 정규 표현식으로 필드 구분 기호를 설정하십시오(이것은 "모든 공백 시퀀스"를 의미하는 특수한 경우입니다. 즉, 기본값): awk -F '[ ]' '/WORD/ {print $2}'.

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

답변3

주문,

cat fileName | awk '/WORD/ { print $2 }'

cat주문 도 필요하지 않습니다 . 당신은 시도 할 수 있습니다,

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

다음 명령은 출력을 cat에서 grep으로 리디렉션한 후 잘라냅니다.

cat fileName | grep WORD | cut -f 2 -d ' '

출력 리디렉션을 피해야 할 가능성이 높습니다. awk는 이 작업을 한 줄로 수행하지만 특정 단어가 포함된 줄만 가져오고 구분 기호 공간을 기반으로 열 2를 인쇄하는 명령이 cut필요합니다 .grep

잘라내기가 실패하면 awk에서 이러한 작업을 수행할 수 있습니다.

관련 정보