Wchodzę w świat Linuksa, aw pracy używam grep
coraz więcej. Robiąc to, dochodzę do wniosku, że czasami nie jest to odpowiednie do tego, czego chcę.
Walczyłem z grep
tym 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ć grep
i spędzać dużo czasu, kiedy mogłem to zrobić awk
i zaoszczędzić czas?
less
do przeglądania pliku. Służygrep
do przeszukiwania pliku. Użyjsed
do edycji pliku. Użyjawk
go,grep
ased
plik, który chcesz przetworzyć, ma jakąś strukturę (np. Kolumny). Użyjsed
ciąguawk
gdy 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.Odpowiedzi:
sed
iawk
są nadzbioremgrep
, są rzeczy, które łatwiej zrobić z jednym lub drugim.grep foo
można napisaćsed '/foo/!d'
lubawk /foo/
, ale rozważ:grep -i foo
musiałoby tak być,sed '/[fF][oO][oO]/!d'
chyba że chcesz rozważyć niestandardowe rozszerzenia, takie jak GNUsed '/foo/I!d'
. Lubawk
: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
grep
jest prostym narzędziem, ale ma bardzo wyspecjalizowane tryby działania, które są trudniejsze do odtworzenia za pomocąawk
lubsed
: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"])'
zawk
, brak bezpośredniego odpowiednika zsed
).grep -r
dla wyszukiwania rekurencyjnegogrep -P
/pcregrep
dla wyrażeń regularnych podobnych do Perla (niektóresed
implementacje mają obsługę wyrażeń regularnych podobnych do Perla, choć nie te najważniejsze)grep -o
aby zwrócić dopasowaną część (kilka wierszyawk
lubsed
zrobić to samo)grep -A/B/C
aby zwrócić kontekst wokół meczu (ponownie bolesne robić w podobny sposób zsed
lubawk
)sed
s/foo/bar/
:sed
„Ss
komenda posiada cechy, które są trudne do wdrożenia wawk
takich jak:s/foo\(.*\)bar/\1/g
: przechwytywanie (chociaż GNU awk ma do tegogensub()
rozszerzenie)s/foo/bar/3
: zastąp 3. wystąpienie w każdej liniiawk
).awk
awk
jest najbardziej bogaty w funkcje spośród wszystkich trzech.perl
perl
jako 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 tesed
/awk
stają się przestarzałe).Opanowanie
perl
do przetwarzania tekstu daje poważną przewagę. Polecam poświęcić temu trochę czasu, nawet zanim przyjrzymy się na przykład mniej popularnymsed
poleceniom.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
grep
lubsed
implementacje, 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 ...źródło
awk
jest znacznie szybsze niżgrep
.mawk
wiadomo, ż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)