Czy jest jeszcze jakiś powód, aby uczyć się AWK?


109

Ciągle uczę się nowych narzędzi, nawet tych staromodnych, ponieważ lubię używać właściwego rozwiązania problemu.

Niemniej jednak zastanawiam się, czy jest jeszcze jakiś powód, aby się uczyć niektórych z nich. awkna przykład jest interesujące dla mnie, ale dla zwykłego przetwarzania tekstu, można użyć grep, cut, sed, itd., podczas gdy dla skomplikowanych, pójdę do Pythona.

Nie mam na myśli, że to nie jest potężne i poręczne narzędzie. Ale skoro nauka nowego narzędzia wymaga czasu i energii, czy warto ?


2
jest rok 2019 i właśnie przepisałem normalizator logów Pythona w awk. Przeprowadziłem transformację na tygodniowych plikach dziennika, które miały 54 miliony linii pliku dziennika (~ 9 GB). Na moim Macbooku Pro (2,8 GHZ i7, 16 GB RAM) wersja Pythona mogła przetwarzać ~ 10k linii na sekundę => 90 minut działania. Korzystając z mawk, czas działania skrócił się do 2 minut. Przy okazji, program awk był o połowę mniejszy.
mistahenry

@mistahenry czy próbowałeś pypy?
qwr

Odpowiedzi:


97

Myślę, że zależy to od środowiska, w którym się znajdujesz. Jeśli jesteś osobą * nix, wiedza awkjest Dobrą Rzeczą. Jedynym innym środowiskiem skryptowym, które można znaleźć praktycznie w każdym * nixie, jest sh. Więc podczas grep, sed,etc pewnością może zastąpić awkna nowoczesnej powszechnej linuxdystrybucji, po przeniesieniu do bardziej egzotycznych systemów, znając trochę awkbędzie rzeczywistym Handy.

awkmoże być również używany nie tylko do przetwarzania tekstu. Na przykład jeden z moich przełożonych pisze kod w astronomii awk- to zupełnie jak stara szkoła i niesamowite jest. W jego czasach było to najlepsze narzędzie do pracy ... a teraz, mimo że jego uczniowie, tacy jak ja, używają Pythona, a co nie, trzyma się tego, co wie i działa dobrze.

Podsumowując, na całym świecie krąży dużo starego kodu, wiedząc, że trochę awknie zaszkodzi. To także sprawi, że będziesz lepszym * nix person :-)


12
++ Zgoda, awk jest naprawdę jednym z najbardziej przenośnych i, co ważne, spójnych narzędzi w zestawie narzędzi * nix. Działa niezawodnie na przykład na busybox, gdzie nigdzie nie można znaleźć perla.
działa

1
I naprawdę nie jest tak trudno się nauczyć, jeśli jesteś przyzwyczajony do języków klamrowych
broń

2
„Tak samo jest w każdym środowisku” - niezupełnie: w systemie Windows pojedyncze cudzysłowy muszą zostać zastąpione podwójnymi, si wewnętrznymi podwójnymi znakami ucieczki. (Windows jest rodzajem prawdziwego środowiska, nawet jeśli wystawienie się na niepewne, na wpół ukończone okrucieństwo Redmonda stawia cię na łasce każdego rosyjskiego 15-latka).
GT.

6
Nie wydaje mi się, żeby wiele osób kojarzyło istnienie awk i windows w tym samym wszechświecie .....: P
FoldedChromatin

2
Nadal używam awk do zadań przetwarzania tekstu. Często zaczynam skrypt w czymś innym (ruby, python) i wracam do awk ze względu na prostotę i moc.
Rumbleweed

104

Jeśli szybko nauczysz się podstaw awk, możesz rzeczywiście robić niesamowite rzeczy w wierszu poleceń.

Ale prawdziwym powodem nauki awk jest wymówka, by przeczytać znakomitą książkę The AWK Programming Language jej autorów, Aho, Kernighana i Weinbergera. Z nazwy można by pomyśleć, że po prostu uczy cię awk. Właściwie to dopiero początek. Wchodząc w szeroki wachlarz problemów, które można rozwiązać, gdy używa się zwięzłego języka skryptowego, który ułatwia manipulowanie ciągami znaków - a awk był jednym z pierwszych - kontynuuje naukę czytelnika, jak zaimplementować bazę danych, parser, interpreter i (jeśli pamięć mi służy) kompilatorem dla języka komputerowego dla małego projektu! Gdyby tylko zaprogramowali przykładowy system operacyjny za pomocą awk, książka byłaby dość kompletnym wprowadzeniem do ankiety do informatyki!

Doskonale przejrzysty i zwięzły, podobnie jak oryginalna książka w języku C, jest również wspaniałym przykładem przyjaznego, technicznego pisania, wykonanego poprawnie. Nawet indeks to sztuka rzemieślnicza.

Awk? Jeśli go znasz, będziesz go czasami używać w wierszu poleceń, ale w przypadku czegokolwiek większego poczujesz się uwięziony, nie mogąc uzyskać dostępu do szerszych funkcji systemu i Internetu, do których zapewnia dostęp coś takiego jak Python. Ale książka? Zawsze będziesz zadowolony, że to przeczytałeś!


5
+1 sprzedane. Zamawiam tę książkę. Od lat używam awk jako szybkiego i potężnego jednowierszowego języka skryptowego. Awk to świetny preprocesor dla plików, których kodowanie wymagałoby kilkunastu wierszy. Nie mogę zliczyć, ile razy użyłem formularza: awk '{print $ 1, $ 2}'
galaxywatcher

2
Zgoda. Niemal nie można uwierzyć, jak kompaktowa jest ta książka ze wszystkim, co zawiera. Obejmuje więcej niż większość współczesnych książek w 1/10 (?) Długości.
glina

3
Czytam teraz tę książkę i rozpalił mój entuzjazm dla awk do niemal obsesji.
galaxywatcher

3
Zobacz także doskonały Gawk: Efektywne programowanie w AWK .
lhf

1
Właśnie przeczytałem pierwszy rozdział. To jest niesamowite. Tajemnica rozwiązana.
vaichidrewar

29

Jedynym powodem, dla którego używam, awkjest automatyczne dzielenie:

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

Spowoduje to wypisanie trzeciego pola rozdzielanego spacjami w file.in. To trochę łatwiejsze niż:

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

3
dlaczego używać awk '{print $3}' < file.inzamiast awk '{print $3}' file.in? Czy awk nie czyta już plików przekazanych jako argumenty?
mbigras

@mbigras Jasne, awk można używać w dowolny sposób.
Greg Hewgill

Nawet z doublesize podoba mi się rozwiązanie inne niż awk. I nie wiem, dlaczego nienawidzę awk: /
MD. Mohiuddin Ahmed

25

Myślę, że awk jest świetny, jeśli twój plik zawiera kolumny / pola . Używam go podczas przetwarzania / analizowania określonej kolumny w pliku wielokolumnowym. Lub jeśli chcę dodać / usunąć określoną kolumnę (y).

na przykład

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

zostanie wydrukowane tylko wtedy, gdy wartość drugiej kolumny w pliku rozdzielanym tabulatorami jest większa niż wartość w trzeciej kolumnie.

Oczywiście mógłbym użyć Perla lub Pythona, ale awk sprawia, że ​​jest to o wiele prostsze dzięki zwięzłemu poleceniu jednowierszowemu.

Również nauka awk jest dość tania. Możesz nauczyć się podstaw awk w mniej niż godzinę, więc nie jest to tak duży wysiłek, jak nauka jakiegokolwiek innego języka programowania / skryptów.


Chociaż tak naprawdę rzadko używam awk, jest to świetne zastosowanie dla awk.
Paul Nathan,

8

Czasami używam AWK do pracy z HTML. Na przykład ten kod tłumaczy tabele na pliki csv:

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

Co jest świetne, jeśli skrobisz ekran. Właściwie może się zdarzyć, że uwielbiam AWK, ponieważ pozwala mi tak szybko zbudować niewłaściwe rozwiązanie problemów :) więcej przykładów . Wspomina się o tym także w cudownych perłach programowania Jona Bentleya .


7

Często używam awk. Jest to dobre rozwiązanie do bardzo prostego tasowania tekstu w środku potoku; wypełnia bardzo wąską niszę między nie potrzebowaniem go wcale a potrzebą wyrzucenia Perla / Pythona / czegokolwiek.

Nie radziłbym spędzać nad tym dużo czasu, ale może się przydać znajomość podstaw składni - przynajmniej na tyle, abyś mógł szybko zapoznać się z instrukcją, jeśli kiedykolwiek zechcesz z niej skorzystać.


5

Większość linerów awk one można osiągnąć za pomocą wkładek Perl one - jeśli zdecydujesz się wejść w sposób myślenia Perl one liner. Lub po prostu użyj trzech linerów Perl :)

Jeśli utrzymujesz skrypty powłoki napisane przez kogoś, kto lubił awk, to oczywiście będziesz musiał się nauczyć awk.

Nawet jeśli nie ma praktycznej potrzeby, jeśli znasz już wyrażenia regularne, opanowanie podstaw nie zajmie dużo czasu i fajnie jest zobaczyć, jak projektowano wtedy. Jest raczej elegancki.


5

Po 6 latach od zadania tego pytania mogę teraz z całą pewnością odpowiedzieć: nie, uczenie się awk nie jest tego warte.

Podstawowe zadania są obsługiwane, ale podstawowe polecenia bash, a nawet narzędzia GUI są łatwe. Bardziej złożone zadania można łatwo rozwiązać za pomocą nowoczesnych języków dynamicznych, takich jak Python (ulubiony lub mój) lub Ruby.

Zdecydowanie powinieneś nauczyć się współczesnego dynamicznego języka skryptowego, ponieważ pomoże ci on w wielu zadaniach (przeglądarka internetowa, administrator, przetwarzanie danych, automatyzacja itp.). W ten sposób uczenie się narzędzi takich jak awk jest całkowicie bezużyteczne, oszczędza co najwyżej kilka sekund każdego miesiąca.


2
Niekoniecznie prawda. Jeśli analizujesz naprawdę duże pliki, może to być znacznie szybsze niż w przypadku innych narzędzi.
user1071847

Ciekawe, ponieważ kilka lat później nadal zadajesz pytania dotyczące awk. Byłem jednym z pierwszych respondentów i nadal używam go z pewną regularnością do dziś
Dexygen,

4

Jeśli znasz już seda i używasz go, równie dobrze możesz przyswoić sobie przynajmniej trochę awk. Można je łączyć ze sobą w celu wykonania całkiem potężnych sztuczek. Zawsze zachwyca publiczność.


4

Computerworld przeprowadził niedawno wywiad z Alfredem V. Aho (jednym z trzech twórców AWK) na temat AWK. To całkiem ciekawa lektura. Może więc znajdziesz w tym kilka wskazówek, dlaczego warto nauczyć się AWK.


Miło, ale mnie nie przekonało. AWK to bardzo dobre narzędzie, ale myślę, że nigdy nie będę go potrzebował na tyle, aby się go nauczyć, zamiast hakować moje rozwiązanie w sedzie lub pythonie.
e-satis

4

Nauka AWK była dla mnie nieoceniona podczas mojego ostatniego kontraktu pracującego nad wbudowanym systemem Linux, na którym nie był zainstalowany ani Perl, ani większość innych języków skryptowych.


2
9 lat później i użyłem awk dużo dzisiaj podczas grepping dzienniki git
Dexygen

3

awk ma bardzo dobry stosunek użyteczność / trudność, a „prosty awk” działa w każdym Uniksie / Linuksie / MacOS (i może być również zainstalowany w innych systemach).

Został zaprojektowany w złotym wieku, kiedy ludzie nienawidzili pisania, więc skrypty mogą być bardzo, bardzo krótkie i szybkie do napisania. Spróbuję zainstalować mawk, szybką wersję, podobno przyspiesza obliczenia około 9 razy, awk / gawk jest raczej powolny, więc jeśli chcesz go użyć zamiast R itp., Możesz chcieć mawk.


2

Jest to przydatne głównie wtedy, gdy musisz od czasu do czasu analizować pliki dziennika w poszukiwaniu danych lub danych wyjściowych programów podczas wykonywania skryptów powłoki, ponieważ w awk bardzo łatwo jest to osiągnąć, co zajęłoby trochę więcej linii kodu w Pythonie.

Z pewnością ma więcej mocy, ale wydaje się, że są to zadania, do których większość ludzi go używa.


2

Oczywiście: pracuję w środowisku, w którym jedynymi dostępnymi językami są: (jakiś shity language, który generuje COBOL, OMG, OMG), bash (stara wersja), perl (jeszcze go nie opanowałem), sed, awk i kilka innych narzędzi wiersza poleceń. Wiedza awkpozwoliła mi zaoszczędzić kilka godzin (i wygenerowałem kilka zadań związanych z przetwarzaniem tekstu z moich uczelni - przychodzą do mnie co najmniej trzy razy dziennie).


1

Powiedziałbym, że prawdopodobnie już nie warto. Używam go od czasu do czasu jako o wiele bardziej wszechstronnego edytora strumieniowego niż sed z włączonymi możliwościami wyszukiwania, ale jeśli jesteś biegły w Pythonie, nie znam zadania, które byłbyś w stanie ukończyć o wiele szybciej, aby zrekompensować potrzebny czas nauczyć się awk.

Następujące polecenie jest prawdopodobnie jedynym, dla którego używałem awk w ciągu ostatnich dwóch lat (usuwa częściowo usunięte pakiety z moich systemów Debian / Ubuntu):

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

1

Nie.

Chociaż może to być interesujące, możesz zrobić wszystko, co potrafi awk, używając innych, potężniejszych narzędzi, takich jak Perl.

Poświęć swój czas na naukę tych potężniejszych narzędzi - i tylko przypadkowo zdobądź po drodze awk.


1

Powiedziałbym, że jest. W przypadku prostych rzeczy, AWK jest dużo łatwiejsze dla niedoświadczonego administratora / programisty niż Python. Możesz nauczyć się trochę AWK i zrobić wiele rzeczy, nauka Pythona oznacza naukę zupełnie nowego języka (tak, wiem, że AWK to język to też zmysł).

Perl może być w stanie zrobić wiele rzeczy, które potrafi AWK, ale zaoferowałem wybór w dzisiejszych czasach wybrałbym tutaj Pythona. Więc tak, powinieneś nauczyć się AWK. ale naucz się też Pythona :-)


1

awkjest językiem elektronarzędzi, więc awkjeśli jesteś informatykiem, prawdopodobnie znajdziesz go gdzieś. Jeśli można obsługiwać składni i regularnych wyrażeń grepi sedwtedy nie powinno być problemu zrywania się awki to chyba warto.

Gdzie znalazłem awknaprawdę połysk jest uproszczenie rzeczy jak przetwarzanie rekordy kilka linii i maglowania / interpolację wielu plików jednocześnie.


0

Teraz, gdy PERL jest przeniesiony na prawie każdą znaczącą platformę, powiedziałbym, że nie jest tego wart. Jest bardziej wszechstronny niż razem sed i awk. Jeśli chodzi o automatyczne dzielenie, możesz to zrobić w perlu w ten sposób:

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

EDYCJA: nadal możesz chcieć nieco zapoznać się z awk, ponieważ niektóre inne narzędzia są oparte na jego filozofii działań opartych na wzorcach (np. DTrace w systemie Solaris).


0

Pracuję w obszarze, w którym pliki są w formacie kolumnowym. Dlatego awk jest dla mnie nieoceniony w REFORMATOWANIU pliku, tak aby różne programy mogły ze sobą współpracować. W przypadku zawodów niezwiązanych z IT używanie awk jest wystarczające i doskonałe. W dzisiejszych czasach szybkość komputera nie jest problemem, więc mogę połączyć awk i unix, aby przesłać wiele poleceń 1 linijek do „skryptu”. Dzięki wyszukiwaniu w Awk według pól i rekordów używam go do bardzo szybkiego sprawdzania danych pliku, zamiast „vi” do otwierania pliku. Muszę powiedzieć, że możliwości awk szczególnie przyniosły radość mojej pracy. Jestem w stanie pomóc współpracownikowi w szybkim rozwiązywaniu problemów za pomocą awk. Niesamowity kod dla mnie.


0

Niedawno próbowałem wyobrazić sobie pliki sieciowe pcap rejestrujące atak DOS o wartości ponad 20 Gb / s. Potrzebowałem znacznika czasu i adresów IP. W moim scenariuszu jednolinijkowy AWK działał fantastycznie i całkiem szybko. Specjalnie użyłem AWK do wyczyszczenia rozpakowanych plików, uzyskania adresów IP i całkowitej liczby pakietów z tych adresów IP w zgrupowanym przedziale czasu. Całkowicie zgadzam się z tym, co napisali powyżej inni. To zależy od Twoich potrzeb.


0

Jednym z powodów, dla których NIE należy uczyć się awk jest to, że nie ma on niechcianych dopasowań w wyrażeniach regularnych.

Mam kod awk, który teraz muszę przepisać tylko dlatego, że nagle zdebugowałem, że w awk / gawk nie ma czegoś takiego jak niechciane dopasowania, więc nie może poprawnie wykonać niektórych wyrażeń regularnych.


0

To zależy od twoich kolegów z zespołu, twojego lidera i zadania, nad którym pracujesz.

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

Obecnie zajmuję się kodowaniem w Pythonie. Ale nadal nie znam go na tyle dobrze, aby łatwo go używać do prostych, jednorazowych przekształceń plików.

Dzięki awk mogę szybko opracować jednowierszowy fragment kodu w linii poleceń unixa, który wykonuje całkiem niezłe transformacje. Za każdym razem, gdy używam awk, napisany przeze mnie fragment kodu będzie jednorazowy i nie będzie dłuższy niż kilka wierszy. Może instrukcja „if” i instrukcja „printf” tu lub tam w jednym wierszu.

W awk nigdy nie napisałem fragmentu kodu dłuższego niż 10 linii. Kilka takich skryptów widziałem lata temu.

Ale wszystko, co wymagało wielu wierszy kodu, użyłbym Pythona.

Uwielbiam awk. Jest to bardzo potężne narzędzie w połączeniu z sedem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.