Perl, Python, AWK 및 sed의 차이점은 무엇입니까? [닫은]


253

그들 사이의 주요 차이점이 무엇인지 알고 싶습니까? 각 언어의 힘 (사용하는 것이 더 나은 곳).

편집 : "vs"가 아닙니다. 주제와 같은 정보 일뿐입니다.


142
이러한 유형의 비 건설적인 질문은 정말 도움이됩니다.
Steam

10
물론, 첫 페이지에 탭들을 편리하게 ... 될 찾을 수

커맨드 라인에서 파이썬의 유용성을 위해 pyp
Neil McGuigan

답변:


550

외관 위해, 언어는 sed, awk, perl, python.

sed프로그램은 스트림 편집기이며 스크립트에서 입력 파일의 각 행 (또는 일반적으로 지정된 행 범위)에 조치를 적용하도록 설계되었습니다. 언어는 edUnix 편집기를 기반으로 하며 조건부 등이 있지만 복잡한 작업을 수행하기는 어렵습니다. 사소한 기적을 할 수는 있지만 머리에는 머리카락이 비쌉니다. 그러나, 그것은 송금 내에서 작업을 시도 할 때 아마도 가장 빠른 프로그램 일 것입니다. (이것은 논의 된 프로그램의 가장 강력한 정규 표현식을 가지고 있습니다-많은 목적에 적합하지만 확실히 PCRE는 아닙니다-Perl 호환 정규 표현식)

awk프로그램 (저자 이니셜의 이름-Aho, Weinberger 및 Kernighan)은 처음에 보고서 형식을 지정하는 도구입니다. 수프로 사용할 수 있습니다 sed. 최신 버전에서는 계산이 완료되었습니다. 흥미로운 아이디어를 사용합니다.이 프로그램은 '패턴 일치'와 '패턴 일치시 취한 조치'를 기반으로합니다. 패턴은 상당히 강력합니다 (확장 정규식). 동작 언어는 C와 비슷합니다. 주요 특징 중 하나 awk는 입력을 레코드로 자동 분할하고 각 레코드를 필드로 분할한다는 것입니다.

Perl은 부분적으로 awk-killer와 sed-killer로 작성되었습니다. 그것은되어 함께 제공되는 프로그램의 두 a2ps2p변환 awk스크립트와 sed펄에 스크립트를. Perl은 차세대 스크립팅 언어 중 가장 빠른 것 중 하나입니다 (Tcl / Tk가 우선권을 주장 할 수 있음). 훨씬 더 강력한 언어로 강력한 정규식 처리 기능을 통합했습니다. 거의 모든 시스템 호출에 액세스 할 수 있으며 CPAN 모듈의 확장 성이 있습니다. (어느 쪽 awksed확장 가능합니다.) 펄의 모토 중 하나는 "TMTOWTDI - 그것을 하나 개 이상의 방법이있다"( "팀-아첨"로 발음). Perl은 '객체'를 가지고 있지만 언어의 기본 부분보다는 추가 기능입니다.

파이썬은 마지막에 쓰여졌으며 아마도 부분적으로 Perl에 대한 반응으로 작성되었습니다. 흥미로운 문법 아이디어가 있습니다 (중괄호 또는 동등한 것이 없음을 나타내는 들여 쓰기). 이것은 Perl보다 근본적으로 객체 지향적입니다. Perl만큼 확장 가능합니다.

좋아-언제 사용합니까?

  • Sed-파일에서 간단한 텍스트 변환을 수행해야 할 때.
  • Awk-간단한 형식화 및 요약 또는 데이터 변환이 필요한 경우.
  • Perl-거의 모든 작업에 적합하지만 특히 복잡한 정규식이 필요한 작업에 적합합니다.
  • Python-Perl과 동일한 작업을 수행합니다.

펄이 할 수없는 일, 파이썬이 할 수없는 일, 그 반대의 일에 대해서는 전혀 모른다. 이 둘 사이의 선택은 다른 요소에 달려 있습니다. 파이썬이 있기 전에 Perl을 배웠으므로 사용하는 경향이 있습니다. 파이썬은 구문이 적고 일반적으로 배우기가 다소 간단합니다. Perl 6이 출시되면 매력적인 개발이 될 것입니다.

(특히 Perl과 Python의 '개요'는 매우 불완전합니다. 전체 책을 주제로 작성할 수 있습니다.)


82
A ++++ post, 다시 읽을 것입니다!
Robert Gamble

24
멋진 특히 일부 "때마다 사용하는"
칼리드 알 Hourani

6
zen of python은 기본적으로 TMTOWTDI의 대립 법이므로 펄에 대한 반응 일 수 있습니다. IIRC TCL은 펄 후 다소이었다 TCLs 반응이 일 할 수있는 방법, 문법과 언어의 복잡성이 아니지만, 또한 펄에 대한 상당히 반동적 인
JK가.

7
원래 의도가 무엇이든, 나중에 파이썬 개발과 파이썬 커뮤니티는 Perl의 더 유연하지만 간결한 구문보다 가독성과 일관성을 선호한다는 것이 분명합니다. 우수한 포스트 Jonathan
Martin Beckett

4
@blasto : ETL를 들어, 내가 우선 순위를 줄 awk이상 sed(모두는 여전히 자신의 용도가 있지만) 학습. 작업의 크기와 관련하여 : sed한 줄에 한 줄씩 처리 할 때 가장 좋으며 줄마다 저장소가 없습니다. awk모든 소스에서 축적 된 데이터로 연관 배열을 구축하는 데 종종 사용됩니다. 더 많은 메모리를 사용하므로 대용량 데이터 세트에 문제가 발생할 가능성이 훨씬 높습니다 sed. 나는 tsawk당신이 그것에 연결하기 전에 들어 본 적이 없습니다 . 나는 작업이 너무 많을 때 Perl에 빠지는 경향이 있지만 (Python으로 더 잘 할 수있다) awk.
Jonathan Leffler

91

수십 개의 언어를 습득 한 후, S. Lott와 같은 사람들에 질려 있습니다 (답변 6 년 후이 질문에 대한 그의 논란의 여지가있는 답변, 거의 절반의 다운 투표 수 (+ 45 / -22) 참조).

Sed는 매우 간단한 명령 줄 파이프 라인을위한 최고의 도구입니다. sed master의 손에는 임의의 복잡한 일회성에 적합하지만 매우 간단한 대체 파이프 라인을 제외하고 프로덕션 코드에는 사용해서는 안됩니다. 's / this / that /.'같은 것

Gawk (GNU awk)는 단일 입력 소스와 단일 출력 (또는 여러 출력이 순차적으로 작성 됨)이있을 때 복잡한 데이터 재 포맷에 가장 적합한 선택입니다. 많은 실제 작업이이 설명에 따르고, 좋은 프로그래머는 2 시간 안에 gawk를 배울 수 있으므로 최선의 선택입니다. 이 지구상에서는 간단하고 빠를수록 좋습니다!

입력 / 출력 시나리오가 매우 복잡한 경우 Perl 또는 Python이 awk 또는 sed 버전보다 훨씬 우수합니다. 문제가 복잡할수록 유지 관리 및 가독성 관점에서 파이썬을 사용하는 것이 좋습니다. 그러나 훌륭한 프로그래머는 모든 언어로 읽을 수있는 코드를 작성할 수 있으며, 나쁜 프로그래머는 유용한 언어로 유지 보수 할 수없는 쓰레기를 쓸 수 있으므로 펄이나 파이썬의 선택은 프로그래머가 선호하는 경우 프로그래머의 선호에 안전하게 맡길 수 있습니다 숙련되고 영리합니다.


9
100 % 동의했다. 모든 도구가 아니더라도 각 도구를 언제 사용해야하는지 잘 아는 것은 훌륭한 기술자와 평범한 기술자를 구별하는 것입니다.
ata

6
awk 대신 Python 또는 Perl을 선택하는 또 다른 이유는 변환 요구 사항에 다른 언어에 기존의 강력한 모듈이있는 복잡한 유효성 검사 또는 논리가 포함되어 있기 때문입니다. awk에서 전자 메일이나 주소를 올바르게 처리하는 데 필요한 것이 무엇인지 생각하면 무슨 의미인지 알 수 있습니다. perl과 python에는 이러한 사소한 것들을 만드는 라이브러리가 있습니다.
sorpigal

3
실제로 Perl은 Sed와 Awk를 모두 포함하도록 설계되었습니다. Sed 또는 Awk를 배우는 대신 Perl로 작성하는 것이 더 쉽다는 것을 알았습니다.
브래드 길버트

@BradGilbert : 상단 답변에서 방금 언급 한 것처럼 awk에 대한 Perl (& Python, ruby ​​등) 의주의 사항은 전자의 일부 정규 표현식이 reaaaaaaaaaally 느리다는 것입니다 : swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac

1
@OlivierDulac 예, 병리학 적 사례를 보여줍니다. 에서 a?ⁿaⁿ로 변경 a??ⁿaⁿ한 다음 Perl 5 에서 1,000,000의 값으로 실행하면 2 초 이내에 실행됩니다. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'순진한 것을 실행하면 25 초 동안 2 초 이상 걸립니다 .Perl은 Perl 코드보다 더 빠른 정규식 기능을 가지고 있다는 것을 알고 있습니다. . 원하는 경우 내장 모듈을 다른 모듈 중 하나로 교체하는 모듈을 구현할 수 있습니다.
Brad Gilbert

21

나는 sed를 본격적인 프로그래밍 언어라고 부르지 않을 것이며, 프로그래밍 방식으로 텍스트 파일을 편집하는 것을 목표로하는 언어 구조를 가진 스트림 편집기입니다.

Awk는 좀 더 일반적인 목적 언어이지만 여전히 텍스트 처리에 가장 적합합니다.

Perl과 Python은 본격적인 범용 프로그래밍 언어입니다. Perl은 텍스트 처리에 뿌리를두고 있으며 여러 가지 awk와 유사한 구조를 가지고 있습니다 (넷에 흩어져있는 awk-to-perl 스크립트도 있습니다). Perl과 Python에는 많은 차이점이 있습니다. 가장 좋은 방법은 Wikipedia와 같은 언어로 두 언어의 요약을 읽고 내용을 잘 이해하는 것입니다.


2
나는 Turing Completeness를 암시하는 Sokoban의 sed 구현을 보았습니다. 그러나 sendmail.cf와 TeX에 대해서도 언급 할 수 있습니다.
ConcernedOfTunbridgeWells

7
레이저 프린터를 라우터로 바꾸기 위해 PostScript를 작성한 한 남자와 일했습니다.
Sam Kington

10
@ 샘 :와! 나는 프린터의 레이저가 나무를자를만큼 크랭크 될 수 있다는 것을 몰랐다! 죄송합니다. 잘못된 라우터입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

2
본격적인 언어가 아닌 sed? 글쎄, 그건 완전히 사실이 아니다 튜링 나오지도 )
버나드 폴 러스

1
나는 awk에서 네 번째 언어의 구현을 보았습니다. awk는 그 자체로는 파서로 간주 될 수 있으므로 인터프리터를 구현하는 것이 다소 간단합니다.
Tatjana Heuser

19

먼저, "Perl, Python awk 및 sed"목록에 관련이없는 두 가지가 있습니다.

일 1-단순한 텍스트 조작 도구.

  • sed. 파일의 각 줄을 읽고 검사한다는 개념으로 정의 된 비교적 간단한 작업 범위를 갖습니다. sed는 특히 읽을 수 있도록 설계되지 않았습니다. 매우 작은 유닉스 서버에서 매우 작고 효율적으로 설계되었습니다.

  • 어 wk. 약간 덜 고정되고 덜 간단한 작업 범위가 있습니다. 그러나 awk 프로그램의 메인 루프는 소스 파일의 행을 암시 적으로 읽는 것으로 정의됩니다.

이들은 "완전한"프로그래밍 언어가 아닙니다. 약간의 작업으로 상당히 정교한 프로그램을 쓸 수는 있지만 빠르게 복잡하고 읽기가 어렵습니다.

일 2-범용 프로그래밍 언어. 여기에는 다양한 문장 유형, 수많은 내장 데이터 구조가 있으며 유선 가정이나 단축 법이 없습니다.

  • 펄.

  • 파이썬.

사용시기

  • sed. 못. 실제로 32K 이상의 메모리를 가진 컴퓨터의 시대에는 아무런 가치가 없습니다. Perl 또는 Python은 동일한 작업을보다 명확하게 수행합니다.

  • 어 wk. 못. sed와 마찬가지로, 그것은 초기 컴퓨팅 시대를 반영합니다. 성공적인 시스템에 필요한 다른 모든 언어 외에도이 언어를 유지하기보다는 모든 것을 한 가지 쾌적한 언어로하는 것이 더 즐겁습니다.

  • 펄. 모든 종류의 프로그래밍 문제. 똑같은 일을하는 많은 방법이 많은 자유 생각 구문을 좋아한다면, 펄은 재미있다.

  • 파이썬. 모든 종류의 프로그래밍 문제. 선택의 폭이 좁고 미묘함이 적고 명확성이 더 높은 구문이 상당히 제한되어있는 경우. 파이썬의 객체 지향적 특성은 크고 복잡한 문제에 더 적합합니다.

배경-나는 sed를 강타하지 않고 무지에서 벗어납니다. 나는 20 년 전에 awk를 배웠다. 그것으로 많은 일을했다; 핵심 유닉스 기술로 가르치는 데 사용됩니다. 나는 약 15 년 전에 펄을 배웠다. 그것으로 많은 정교한 것들을 했어. 파이썬에서 똑같은 일을 할 수 있기 때문에 두 가지를 모두 남겨 두었습니다. 더 간단하고 명확합니다.

sed와 awk에는 두 가지 심각한 문제가 있으며 그중 어느 것도 나이가 아닙니다.

  1. 그들의 구현의 불완전 성. sed와 awk가 수행하는 모든 작업은 Python 또는 Perl에서 수행 할 수 있으며 종종 더 간단하고 때로는 더 빠릅니다. 셸 파이프 라인은 다중 처리로 인해 몇 가지 성능 이점이 있습니다. 파이썬은 subprocess이러한 장점을 복구 할 수 있는 모듈을 제공합니다 .

  2. 또 다른 언어를 배울 필요가 있습니다. Python (또는 Perl)에서 작업을 수행하면 구현이 더 적은 언어에 의존하여 결과의 ​​선명도가 높아집니다.


66
awk / sed에 대한 꽤 치명적인 주장. 조정 가능한 렌치는 sed와 awk가 여전히 배송되는 것과 같은 이유로 열린 스패너를 대체하지 않았습니다. 때로는 간단한 도구가 작업에 가장 적합합니다. 나는 많은 perl을 작성하지만 간단한 파이프 명령 체인의 경우 awk / sed가 perl -e보다 빠릅니다.
RET

27
대부분의 비 리눅스 유닉스 시스템에서는 sh, sed 및 awk 이외의 가용성을 가정 할 수 없습니다. 즉시 사용 가능한 Solaris, HP / UX 또는 AIX 설치에서 무언가를 작동 시키려면 sed와 awk가 붙어 있습니다.
ConcernedOfTunbridgeWells

27
내 셸 스크립트의 절반은 sed 또는 awk를 사용합니다. 그들은 죽지 않았다. 파이썬은 내가 선호하는 스크립팅 언어이지만 때로는 sed와 awk가 작업에 가장 적합한 도구입니다. 그들이 오랫동안 사용되어 왔다고해서 그들이 쓸모 없다는 것을 의미하지는 않습니다.
Jeremy Cantrell

16
@ S.Lott : 누구나 awk에서 웹 응용 프로그램을 만들려고 제안하지는 않지만 절대로 사용해서는 안된다는 말은 약간 터무니 없습니다. 간단한 s & r 및 / 또는 tweak (특히 구분 된 텍스트 파일)의 경우 perl -e 또는 python -c는 sed / awk one-liner만큼 효율적이지 않습니다.
RET

25
나는 이런 대답을 좋아하지 않는다. Sed와 awk는 몇 시간 만에 이해하기 쉽고 완전한 언어보다 훨씬 가볍고 널리 사용 가능합니다. 쉘 프로그래밍은 그 어느 때보 다 중요하며 "사용하지 마십시오"라고 말하면 공구가 단순히 지체됩니다. 그러나이 지체 된 아이디어는 Perl이 등장한 기초 중 하나가 아니 었습니까? 오 잘
ata

14

사용시기 : awk-never-S. Lott.

나는 S. Lott이이 추천으로 그 마크를 약간 놓쳤다 고 생각합니다. 사실 Linux 및 기타 UNIX 환경에서 awk는 빠른 텍스트 처리를 위해 bash, sh 및 ksh와 함께 사용할 수있는 유용한 도구입니다. 스크립팅 자체의 아이디어는이 도구 인 해당 도구를 함께 붙여서 문제를 해결하는 것입니다. 따라서 관리자 스크립트에서는 ls, grep, |, awk, time, ps 등이있는 것이 일반적입니다. 각각은 스크립터가 빌더 벽돌처럼 벽돌로 결합하여 건물을 완성하는 도구입니다 (당면한 문제를 해결하기 위해) .

예를 들어 페인트 볼 기어 용품을 관리하는 팀의 팀원입니다.닷컴. 이 전자 상거래 사이트는 LAMP 스택을 기반으로합니다. 다양한 공급 업체에서 백엔드 데이터베이스로의 데이터 피드를 자동으로 처리하고 정규화하기 위해 bash, perl, php 등의 다양한 스크립트 조합을 사용하고 유지합니다. 각 모듈은 사용 가능한 모듈과 API를 기반으로합니다. bash 스크립트에서는 PERL로 전환 할 필요없이 awk를 사용하여 필요한 패턴에 대한 빠른 패턴 일치 및 적절한 조치를 수행합니다. 스레드에서 강조하지 않은 한 가지 주목할 점은 상당수의 스크립트를 구매했거나 공개 소스에서 얻은 것입니다. 스크립트가 Perl로 온 경우, 우리는 Perl로 유지합니다. 스크립트가 Php로 온 경우, 우리는 Php로 유지합니다. bash로 온 경우 bash로 유지합니다.


7
그것은 당신이 인용 한 응답하지 브라이언 d 개의 포이을 쓴 S. 로트했다 ...
plusplus

5
이 꽤 오래된 답변에 대한 참고로 :의 출력을 구문 분석하지 ls말고 glob를 대신 사용하십시오. 이것을 읽으십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.