AWK를 배울 이유가 아직 있습니까?


109

나는 문제에 대한 올바른 솔루션을 사용하기를 좋아하기 때문에 구식 도구를 포함하여 새로운 도구를 지속적으로 배우고 있습니다.

그럼에도 불구하고 그들 중 일부를 배울 이유가 있는지 궁금합니다. awk예를 들어 나에게 흥미이지만, 간단한 텍스트 처리를 위해, 내가 사용할 수있는 grep, cut, sed, 등 복잡한 것들에 대한, 내가 파이썬 갈 것이다있다.

강력하고 편리한 도구가 아니라는 의미는 아닙니다. 그러나 새로운 도구를 배우려면 시간과 에너지 가 필요하므로 그만한 가치가 있습니까?


2
2019 년이고 awk에서 파이썬 로그 노멀 라이저를 다시 작성했습니다. 5,400 만 줄의 로그 파일 (~ 9GB) 인 로그 파일을 일주일에 변환했습니다. 내 Macbook Pro (2.8GHZ i7, 16GB Ram)에서 파이썬 버전은 초당 ~ 10k 라인 => 90 분의 런타임을 처리 할 수 ​​있습니다. mawk를 사용하면 실행 시간이 2 분으로 단축되었습니다. Btw, awk 프로그램은 절반 크기였습니다.
mistahenry

@mistahenry pypy를 시도 했습니까?
qwr

답변:


97

나는 당신이 처한 환경에 달려 있다고 생각합니다. 당신이 * nix 사람이라면 아는 awk것이 좋은 것입니다. 거의 모든 * nix에서 찾을 수있는 유일한 다른 스크립팅 환경은 sh. 따라서 grep, sed,awk이 현대 주류 linux배포판에서 확실히 대체 될 수 있지만 , 좀 더 이국적인 시스템으로 이동할 때 조금만 아는 awk것이 Real Handy가 될 것입니다.

awk텍스트 처리 이상의 용도로도 사용할 수 있습니다. 예를 들어, 내 상사 중 한 명이 천문학 코드를 작성 awk합니다. 이것이 그가 얼마나 오래된 학교 이고 대단한지 입니다. 그 당시에는이 작업에 가장 적합한 도구였습니다. 지금은 저와 같은 그의 학생들이 파이썬을 사용하는 것과 그렇지 않은 것에도 불구하고 그는 그가 알고있는 것과 잘 작동하는 것에 집착합니다.

마지막으로, 전 세계에 많은 오래된 코드가 있습니다. 조금이라도 awk아프지 않을 것이라는 것을 알고 있습니다. 그것은 또한 당신을 더 좋게 만들 것입니다 * nix 사람 :-)


12
++ 동의합니다. awk는 * nix 도구 세트에서 가장 이식성이 뛰어나고 중요한 일관된 도구 중 하나입니다. 예를 들어 perl을 찾을 수없는 busybox에서 안정적으로 작동합니다.
guns

1
중괄호 언어에 익숙하다면 배우는 것도 그렇게 어렵지 않습니다
guns

2
"모든 환경에서 동일합니다."-정답은 아닙니다. Windows에서는 작은 따옴표를 큰 따옴표로 바꿔야하고 내부 double은 이스케이프해야합니다. (레드몬드의 안전하지 않은 반쯤 끝난 잔혹 행위에 자신을 노출시켜 15 세 러시아인에게 자비를 베풀어도 Windows는 일종의 실제 환경입니다.)
GT.

6
나는 ..... 많은 사람들이 같은 우주 AWK 창문의 존재를 연결할 생각하지 않는다 : P
FoldedChromatin

2
텍스트 처리 작업에 여전히 awk를 사용합니다. 나는 종종 다른 것 (루비, 파이썬)에서 스크립트를 시작하고 단순성과 힘을 위해 awk로 돌아갈 것입니다.
Rumbleweed

103

awk의 기초를 빨리 배우면 명령 줄에서 놀라운 일을 할 수 있습니다.

그러나 awk를 배우는 진짜 이유 는 저자 Aho, Kernighan, Weinberger가 쓴 멋진The AWK Programming Language 를 읽을 변명을 가지기 위해서 입니다. 이름에서, 그것은 단순히 당신에게 어색함을 가르쳐 준다고 생각할 것입니다. 사실 그것은 시작에 불과합니다. 문자열 조작을 쉽게하는 간결한 스크립팅 언어를 사용하면 해결 될 수있는 방대한 문제를 시작합니다. awk는 첫 번째였습니다. 독자에게 데이터베이스, 파서, 인터프리터를 구현하는 방법을 가르치는 과정이 진행됩니다. , 그리고 (메모리가 나에게 도움이된다면) 작은 프로젝트 특정 컴퓨터 언어를위한 컴파일러! awk를 사용하여 예제 운영 체제도 프로그래밍했다면이 책은 컴퓨터 과학에 대한 상당히 완전한 설문 조사 소개가되었을 것입니다!

원본 C 언어 책처럼 명확하고 간결한 것으로 유명하며, 친근한 기술 문서 작성의 훌륭한 예이기도합니다. 인덱스조차도 장인 정신입니다.

Awk? 알고 있다면 가끔 명령 줄에서 사용 하겠지만, 더 큰 것은 파이썬과 같은 것이 접근 할 수있는 인터넷과 시스템의 더 넓은 기능에 접근 할 수 없다는 느낌이들 것입니다. 하지만 그 책? 당신은 항상 당신이 그것을 읽고 기뻐할 것입니다!


5
+1 판매. 이 책을 주문하겠습니다. 저는 몇 년 동안 빠르고 강력한 한 줄짜리 스크립팅 언어로 awk를 사용해 왔습니다. Awk는 코드에 수십 줄이 걸리는 파일을위한 훌륭한 전 처리기입니다. awk '{print $ 1, $ 2}'
galaxywatcher

2
동의합니다. 그것은 그 책에 포함 된 모든 것이 얼마나 간결한 지에 대한 믿음을 거의 무시합니다. 그것은 대부분의 현대 책보다 1/10 (?) 길이로 다룹니다.
clay

3
나는 지금이 책을 읽고 있는데 그것은 거의 집착에 대한 나의 열정을 불러 일으켰다.
galaxywatcher

3
우수한 Gawk : Effective AWK Programming을 참조하십시오 .
lhf

1
방금 첫 번째 장을 읽었습니다. 놀랍습니다. 미스터리가 해결되었습니다.
vaichidrewar

29

내가 사용하는 유일한 이유 awk는 자동 분할입니다.

awk '{print $3}' < file.in

에서 공백으로 구분 된 세 번째 필드를 인쇄합니다 file.in. 다음보다 약간 쉽습니다.

tr -s ' ' < file.in | cut -d' ' -f3

3
awk '{print $3}' < file.in대신 왜 사용 awk '{print $3}' file.in합니까? awk는 인수로 전달 될 때 이미 파일을 읽지 않습니까?
mbigras

@mbigras 물론입니다. 어느 쪽이든 awk를 사용할 수 있습니다.
Greg Hewgill

doublesize를 사용해도 나는 비 ak 솔루션을 좋아합니다. 그리고 나는 내가 왜 싫어하는지 모르겠다 awk: /
MD. Mohiuddin 아메드

25

파일에 열 / 필드 가 포함되어 있으면 awk가 좋습니다 . 여러 열 파일의 특정 열을 처리 / 분석 할 때 사용합니다. 또는 특정 열을 추가 / 삭제하려는 경우.

예 :

awk -F \t '{ if ($2 > $3) print; }' <filename>

탭으로 구분 된 파일의 두 번째 열 값이 세 번째 열 값보다 큰 경우에만 인쇄됩니다.

물론 Perl이나 Python을 사용할 수 있지만 awk는 간결한 한 줄 명령으로 훨씬 더 간단하게 만듭니다.

또한 awk를 배우는 것은 매우 저렴합니다. awk 기본 사항을 한 시간 이내에 배울 수 있으므로 다른 프로그래밍 / 스크립팅 언어를 배우는 것만 큼 많은 노력이 필요하지 않습니다.


내가 awk를 많이 사용하지는 않지만, 이것은 awk에 아주 유용합니다.
Paul Nathan

8

HTML을 다룰 때 가끔 AWK를 사용합니다. 예를 들어 다음 코드는 테이블을 csv 파일로 변환합니다.

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

화면 스크래핑을 할 때 좋습니다. 사실, 내가 AWK를 좋아하는 경우가 될 수 있습니다. 문제에 대한 잘못된 솔루션을 너무 빨리 구축 할 수 있기 때문 입니다. :) 더 많은 예제 . Jon Bentley의 사랑스러운 Programming Pearls 에서도 언급되었습니다 .


7

나는 자주 awk를 사용합니다. 파이프 라인 중간에서 매우 간단한 텍스트 셔플 링에 적합합니다. 그것은 전혀 필요하지 않은 것과 Perl / Python / 무엇이든 채찍질 할 필요가있는 것 사이에서 매우 좁은 틈새 시장을 채 웁니다.

많은 시간을 할애하라고 조언하지는 않겠지 만, 문법의 기초를 아는 것이 유용 할 수 있습니다. 적어도 사용하고 싶을 때 매뉴얼을 빠르게 참조 할 수있을만큼 충분히.


5

Perl one liner 사고 방식을 선택하면 대부분의 awk one liner를 Perl one liner로 얻을 수 있습니다. 또는 Perl 세 가지 라이너를 사용하십시오 :)

awk를 좋아하는 사람이 작성한 쉘 스크립트를 유지하고 있다면 분명히 awk를 배워야 할 것입니다.

실질적인 필요가 없더라도 정규식을 이미 알고 있다면 기본을 익히는 데 오래 걸리지 않을 것이며 당시의 디자인 방식을 보는 것은 재미 있습니다. 다소 우아합니다.


5

이 질문을 한 지 6 년이 지나면 이제 확실하게 대답 할 수 있습니다. 아니오, awk를 배우는 것은 그만한 가치가 없습니다.

기본 작업은 처리되지만 기본 bash 명령 또는 GUI 도구도 쉽게 처리됩니다. 더 복잡한 작업은 Python (fav 또는 mine) 또는 Ruby와 같은 최신 동적 언어를 사용하여 쉽게 다룰 수 있습니다.

많은 작업 (웹, 관리자, 데이터 크 런칭, 자동화 등)에 도움이되는 mordern 스크립팅 동적 언어를 확실히 배워야합니다. 그리고 그렇게함으로써 awk와 같은 도구를 배우는 것은 전혀 쓸모가 없으므로 매달 기껏해야 몇 초를 절약 할 수 있습니다.


2
반드시 사실은 아닙니다. 정말 큰 파일을 구문 분석하는 경우 다른 도구보다 훨씬 빠를 수 있습니다.
user1071847

그 후 몇 년이 지난 후에도 여전히 awk에 대해 질문하고 있기 때문에 흥미 롭습니다. 나는 원래 응답자 중 하나 여전히이 일에 몇 가지 규칙과 함께 사용
Dexygen

4

이미 sed를 알고 사용하고 있다면 적어도 약간의 awk를 선택하는 것이 좋습니다. 꽤 강력한 트릭을 위해 함께 연결될 수 있습니다. 항상 청중을 감동시킵니다.


4

Computerworld는 최근 AWK에 대해 Alfred V. Aho (AWK의 세 제작자 중 한 명)와 인터뷰를 했습니다. 꽤 흥미로운 읽기입니다. 그래서 아마 당신은 그것에 약간의 힌트를 찾을 수있을 것입니다. 왜 그것이 좋은 생각인지 AWK를 배우는 것이 좋습니다.


좋지만 나를 설득하지 못했습니다. AWK는 매우 좋은 도구이지만 sed 또는 python에서 내 솔루션을 해킹하는 대신 시간을 들여 배우는 데 충분한 시간이 필요하지 않을 것이라고 생각합니다.
e-satis

4

AWK를 배우는 것은 Perl이나 대부분의 다른 스크립팅 언어가 설치되지 않은 임베디드 Linux 시스템에서 작업하는 지난 계약에서 저에게 매우 중요했습니다.


2
자식 로그를 grepping 동안 구년 나중에 오늘 많이 AWK 사용
Dexygen

3

awk는 매우 좋은 비율의 유틸리티 / 난이도를 가지고 있으며 "simple awk"는 모든 Unix / Linux / MacOS에서 작동합니다 (다른 시스템에도 설치할 수 있음).

사람들이 타이핑을 싫어했을 때 황금 시대에 설계 되었기 때문에 스크립트는 매우 짧고 빠르게 작성할 수 있습니다. 빠른 버전 인 mawk를 설치하려고합니다. 계산 속도가 약 9 배 빨라지고 awk / gawk는 다소 느리므로 R 등 대신 사용하려면 mawk를 원할 수 있습니다.


2

셸 스크립팅 중에 데이터 또는 프로그램 출력에 대한 로그 파일을 가끔 구문 분석해야하는 경우에 주로 유용합니다. 왜냐하면 파이썬에서 코드 줄을 조금 더 많이 사용하는 awk에서 달성하기가 매우 쉽기 때문입니다.

확실히 그것보다 더 많은 힘을 가지고 있지만 이것은 대부분의 사람들이 그것을 사용하는 작업 인 것 같습니다.


2

물론 : 저는 사용 가능한 언어가 다음과 같은 환경에서 일하고 있습니다 : (COBOL, OMG, OMG를 생성하는 일부 shity 언어), bash (이전 버전), perl (아직 마스터하지 않음), sed, awk 및 기타 명령 줄 유틸리티. 알기 awk때문에 몇 시간을 절약 할 수있었습니다 (그리고 동료들로부터 몇 가지 텍스트 처리 작업을 생성했습니다. 하루에 세 번 이상 내게 왔습니다).


1

더 이상 가치가 없다고 말하고 싶습니다. 나는 검색 기능이 포함 된 sed보다 훨씬 더 다재다능한 스트림 편집기로 때때로 사용하지만, 파이썬에 능숙하다면 필요한 시간을 보상하기 위해 훨씬 더 빨리 완료 할 수있는 작업을 모릅니다 awk를 배우기 위해.

다음 명령은 아마도 지난 2 년 동안 awk를 사용한 유일한 명령 일 것입니다 (데비안 / 우분투 시스템에서 반쯤 제거 된 패키지를 제거합니다).

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

1

아니.

흥미로울 수도 있지만, Perl과 같은 다른 강력한 도구를 사용하여 awk가 할 수있는 모든 것을 할 수 있습니다.

더 강력한 도구를 배우는 데 시간을 할애하고 우연히 길을 따라 약간의 어색함을 선택하십시오.


1

나는 있다고 말할 것입니다. 간단한 작업을 위해 AWK는 경험이없는 시스템 관리자 / 개발자에게 Python보다 훨씬 쉽습니다. 약간의 AWK를 배우고 많은 일을 할 수 있습니다. Python을 배우는 것은 완전히 새로운 언어를 배우는 것을 의미합니다 (예, AWK가 언어라는 것도 알고 있습니다).

Perl은 AWK가 할 수있는 많은 일을 할 수 있을지 모르지만,이 시대에 선택권을 제공했습니다. 저는 여기서 Python을 선택할 것입니다. 네, AWK를 배워야합니다. 하지만 파이썬도 배우십시오 :-)


1

awk파워 툴 언어이므로 awk어떤 종류의 IT 전문 가든 어딘가에서 사용되는 것을 찾을 수 있습니다. 당신의 구문 및 정규 표현식을 처리 할 수있는 경우 grep그리고 sed당신은 아무 문제 따기가 없어야한다 awk그것은 아마 가치가있다.

내가 awk실제로 빛을 발한 부분은 여러 줄 레코드를 처리하고 여러 파일을 동시에 맹 글링 / 보간하는 것과 같은 작업을 단순화하는 것입니다.


0

이제 PERL이 거의 모든 중요한 플랫폼에 이식되었으므로 그만한 가치가 없다고 말하고 싶습니다. sed와 awk를 함께 사용하는 것보다 다재다능합니다. 자동 분할의 경우 다음과 같이 perl에서 수행 할 수 있습니다.

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

편집 : 다른 도구가 패턴 기반 작업의 철학 (예 : Solaris의 DTrace)을 기반으로하기 때문에 awk에 대해 어느 정도 알고 싶을 수 있습니다 .


0

나는 파일이 열 형식으로 된 영역에서 일합니다. 따라서 awk는 다른 소프트웨어가 함께 작동 할 수 있도록 파일을 다시 포맷하는 데 매우 중요합니다. IT 전문가가 아닌 경우 awk를 사용하면 충분하고 완벽합니다. 이제 하루는 컴퓨터 속도가 문제가되지 않으므로 awk와 unix를 결합하여 많은 1 개의 liner 명령을 "스크립트"로 파이프 할 수 있습니다. 필드 및 레코드로 Awk 검색을 사용하면 파일을 열기 위해 "vi"대신 파일 데이터를 매우 빠르게 확인하는 데 사용합니다. 나는 awk 능력이 특히 내 일에 기쁨을 가져다 주었다고 말해야한다. 나는 동료가 awk를 사용하여 빠르게 일을 정리할 수 있도록 도울 수있다. 나에게 놀라운 코드.


0

저는 최근에 20Gbs가 넘는 DOS 공격을 기록하는 네트워크 pcap 파일을 시각화하려고했습니다. 타임 스탬프와 IP 주소가 필요했습니다. 내 시나리오에서 AWK 한 줄짜리는 엄청나게 빠르게 작동했습니다. 나는 특별히 AWK 를 사용 하여 추출 된 파일을 정리하고, 그룹화 된 시간 범위 내에서 해당 IP 주소에서 IP 주소와 총 패킷 수를 가져 왔습니다. 나는 다른 사람들이 위에 쓴 것에 전적으로 동의합니다. 귀하의 필요에 따라 다릅니다.


0

awk를 배우지 않는 한 가지 이유는 정규 표현식에 탐욕스럽지 않은 일치 항목이 없기 때문입니다.

awk / gawk에 탐욕스럽지 않은 일치와 같은 것이 없다는 것을 갑자기 디버깅했기 때문에 이제 다시 작성해야하는 awk 코드가 있으므로 일부 정규식을 제대로 실행할 수 없습니다.


0

팀 동료와 리더 및 작업중인 작업에 따라 다릅니다.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}

0

나는 현재 파이썬으로 코딩을하고있다. 그러나 나는 단순한 일회성 파일 변환에 쉽게 사용할 수있을만큼 충분히 잘 모릅니다.

awk를 사용하면 유닉스 명령 줄에서 꽤 멋진 변환을 수행하는 한 줄의 코드를 빠르게 개발할 수 있습니다. awk를 사용할 때마다 내가 작성한 코드는 일회용이되고 몇 줄을 넘지 않습니다. "if"문과 "printf"문이 여기 또는 저기 한 줄에있을 수 있습니다.

나는 awk로 10 줄 이상의 코드를 작성한 적이 없다. 몇 년 전에 그런 대본을 보았습니다.

그러나 많은 코드 줄이 필요한 것은 무엇이든 파이썬에 의지 할 것입니다.

나는 awk를 좋아한다. sed와 함께 사용하면 매우 강력한 도구입니다.

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