polecenie grep i znak zastąpienia

0

Szkolę się z poprawnego używania poleceń linuksowych. Nie rozumiem czemu grep zwraca mi to co niżej:

user@user-VirtualBox:~$ grep 'w*a' /etc/passwd
root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

games:x:5:60:games:/usr/games:/usr/sbin/nologin

man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin

mail:x:8:8:mail:/var/mail:/usr/sbin/nologin

news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin

www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

backup:x:34:34:backup:/var/backups:/usr/sbin/nologin

Zgodnie z teorią to powinien zwrócić wszystkie wiersze z pliku /etc/passwd ktore zawierają słowo zaczynające się na 'w' a kończące na 'a', prawda? No a tak nie jest. Pojedyncze apostrofy są użyte więc zabezpieczyłem się przed ingerencją ze strony powłoki. Ktoś potrafi wytłumaczyć skąd taki output? Oraz jak zmodyfikować polecenie aby wyszukał mi to co sądziłem że juz przedstawiona komenda powinna wyszukać.

3

* matchuje 0 lub więcej elementów poprzedniego znaku. Użyj . aby zmatchować cokolwiek pomiędzy w i a tj. grep 'w.*a' /etc/passwd

3

Grep używa wyrażeń regularnych, a nie globów/wildcardów.

0

a ktoś potrafi wytłumaczyć czemu to niżej nie działa dla .*:

username@username-VirtualBox:~$ sudo find /etc/ -name *wd

/etc/security/opasswd

/etc/pam.d/chpasswd

/etc/pam.d/passwd

/etc/passwd

username@username-VirtualBox:~$ sudo find /etc/ -name '.*wd'

username@username-VirtualBox:~$ sudo find /etc/ -name '*wd'

/etc/security/opasswd

/etc/pam.d/chpasswd

/etc/pam.d/passwd

/etc/passwd

Też powinno zadziałać. Tak porąbali z tym, że masakra, nie wiadomo kiedy użyć gwiazdki a kiedy kropki i gwiazdki i tak na czuja trzeba a fajnie by było to zrozumieć.
Może to jest tak że w przeszłości były dwie koncepcje. Jeden gość stworzył pewną logikę którą dziś znamy jako wyrażenia regularne (regexy itp) a drugi inną logikę i stąd teraz takie zamieszanie bo powłoka działa na tym drugim a toole zależnie od implementacji albo na pierwszym jak 'grep' albo drugim jak 'find'.

0
fvg napisał(a):

Też powinno zadziałać. Tak porąbali z tym, że masakra, nie wiadomo kiedy użyć gwiazdki a kiedy kropki i gwiazdki i tak na czuja trzeba a fajnie by było to zrozumieć.

Glob znajdziesz powszechnie np. w plikach .gitignore czy wszędzie indziej, gdzie definiujesz np. jakieś wzorce dotyczące ścieżek do plików itp - używa wildcardów:

**/*.log

Regexy są znacznie bardziej rozbudowane i przez to często wychodzą niezbyt czytelne, np. ten ukradłem ze StackOverflow i powinien dopasowywać UUID:

^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$

Jak masz wątpliwości, czego używa dane narzędzie (a nie zdziwiłbym się, gdyby dało się to zmienić jakąś flagą) to przeważnie <tool> --help coś będzie o tym wspominał. man <tool> pewnie opisze to jeszcze bardziej dogłębnie, ale mi tam średnio się czyta takie rzeczy w terminalu - ale online też można znaleźć man pages np. dla grepa: https://linux.die.net/man/1/grep

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.