Kiedy używać grep, less, awk, sed [zamknięte]

17

Wchodzę w świat Linuksa, aw pracy używam grepcoraz więcej. Robiąc to, dochodzę do wniosku, że czasami nie jest to odpowiednie do tego, czego chcę.

Walczyłem z greptym kilka dni temu, a mój kolega, który jest starszym administratorem Linuksa, powiedział mi, żebym go używał awk. Byłem oszołomiony tym, jak szybko uzyskałem wynik.

Więc moje pytanie brzmi, kiedy zdecydujesz się użyć jednego nad drugim? Z jakimi pytaniami mogę sobie zadać, zanim zacznę pracować grepi spędzać dużo czasu, kiedy mogłem to zrobić awki zaoszczędzić czas?

frankguthrie
źródło
To dobre pytanie, ale tak naprawdę jest bardzo szerokie i opiera się głównie na opiniach. Aby odpowiedzieć na twoje pytanie, używanie grep zamiast awk naprawdę zależy od tego, jak wygodnie używasz awk / sed. Istnieje kilka powodów, dla których należałoby użyć tego w drugim przypadku, na przykład szukając czegoś bardziej konkretnego niż to, co ma do zaoferowania grep lub jeśli próbujesz zastąpić / edytować pliki określonym ciągiem (używając sed). Ale znowu wszystko zależy od twojego poziomu komfortu i doświadczenia z używaniem awk / sed.
ryekayo
7
Służy lessdo przeglądania pliku. Służy grepdo przeszukiwania pliku. Użyj seddo edycji pliku. Użyj awkgo, grepa sedplik, który chcesz przetworzyć, ma jakąś strukturę (np. Kolumny). Użyj sedciągu awkgdy chcą zajmować się głównie z linii (takich jak usuwać lub dodawać wierszy tekstu). Jestem pewien, że ktoś napisze 20-stronicową odpowiedź, która jest pełniejsza niż moja.
Satō Katsura,
Cześć Sato, Nie chodzi o długość, ale o to, co się mówi. A kilka linijek jest bardzo pouczających. Dziękuję Ci.
frankguthrie

Odpowiedzi:

25

sedi awksą nadzbiorem grep, są rzeczy, które łatwiej zrobić z jednym lub drugim.

grep foomożna napisać sed '/foo/!d'lub awk /foo/, ale rozważ:

grep -i foomusiałoby tak być, sed '/[fF][oO][oO]/!d'chyba że chcesz rozważyć niestandardowe rozszerzenia, takie jak GNU sed '/foo/I!d'. Lub awk: awk 'tolower($0) ~ /foo/'lub ponownie używając rozszerzenia GNU: awk -v IGNORECASE=1 /foo/.

Rzeczy, w których różne narzędzia są dobre i niewygodne w przypadku innych narzędzi:

grep

grepjest prostym narzędziem, ale ma bardzo wyspecjalizowane tryby działania, które są trudniejsze do odtworzenia za pomocą awklub sed:

  • grep -i dopasowanie bez rozróżniania wielkości liter (patrz wyżej)
  • grep -Fe "$string"do stałego wyszukiwania ciągów ( export string; awk 'index($0, ENVIRON["string"])'z awk, brak bezpośredniego odpowiednika z sed).
  • (niestandardowe) grep -rdla wyszukiwania rekurencyjnego
  • (niestandardowe) grep -P/ pcregrepdla wyrażeń regularnych podobnych do Perla (niektóre sedimplementacje mają obsługę wyrażeń regularnych podobnych do Perla, choć nie te najważniejsze)
  • (niestandardowy), grep -oaby zwrócić dopasowaną część (kilka wierszy awklub sedzrobić to samo)
  • (niestandardowe), grep -A/B/Caby zwrócić kontekst wokół meczu (ponownie bolesne robić w podobny sposób z sedlub awk)

sed

  • s/foo/bar/: sed„S skomenda posiada cechy, które są trudne do wdrożenia w awktakich jak:
  • s/foo\(.*\)bar/\1/g: przechwytywanie (chociaż GNU awk ma do tego gensub()rozszerzenie)
  • s/foo/bar/3: zastąp 3. wystąpienie w każdej linii
  • (niestandardowy): edycja plików w miejscu (choć jest teraz obsługiwana także przez GNU awk).

awk

awk jest najbardziej bogaty w funkcje spośród wszystkich trzech.

  • dobre do radzenia sobie z liczbami
  • dobre do radzenia sobie z danymi wejściowymi sformatowanymi w kolumnach.
  • dobre do wyodrębniania i łączenia danych z różnych źródeł za pomocą tablic asocjacyjnych.

perl

perljako praktyczne narzędzie do ekstrakcji i raportowania ma to, co najlepsze. Właśnie po to został pierwotnie zaprojektowany (jako narzędzie, które sprawia, że ​​wszystkie te sed/ awkstają się przestarzałe).

Opanowanie perldo przetwarzania tekstu daje poważną przewagę. Polecam poświęcić temu trochę czasu, nawet zanim przyjrzymy się na przykład mniej popularnym sedpoleceniom.

występ

Zasadą jest, że im bardziej wyspecjalizowane narzędzie, tym bardziej wydajne jest to zadanie. Ale to również bardzo zależy od wdrożenia, zadania i kilku innych czynników, a wydajność może mieć kompromisy, które mogą wymagać wzięcia pod uwagę.

Na przykład istnieją pewne greplub sedimplementacje, które są bardzo szybkie, ale na przykład nie obsługują znaków wielobajtowych, więc mogą działać poprawnie tylko na tekstach w języku amerykańskim i angielskim w lokalizacjach wielobajtowych. Lub są szybkie, ponieważ działają na małym buforze o stałej długości, a zatem nie mogą działać na dowolnych danych wejściowych ...

Stéphane Chazelas
źródło
Doskonała odpowiedź! Czy wiesz o wydajności narzędzi? Jestem zdezorientowany stwierdzeniem OP, które awkjest znacznie szybsze niż grep.
pfnuesel,
@pfnuesel, to bardzo zależy od implementacji i wzorca użytkowania. Na przykład mawkwiadomo, że jest bardzo wydajny (ale nie obsługuje znaków wielobajtowych, co jest jednym z powodów, dla których jest bardziej wydajny niż niektóre inne narzędzia)
Stéphane Chazelas