Mam te:
$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
Chciałem znaleźć dokładne dopasowanie do ABB.log.
Ale kiedy to zrobiłem
$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
pokazuje je wszystkie.
Czy mogę uzyskać to, co chciałem, używając grep?
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Ze strony podręcznika grep:
źródło
-F
? jesteś na Solarisie? Jeśli tak, użyj/usr/xpg4/bin/grep
grep
wewnątrz skryptu bash i ta opcja jest lepsza niż użycie wyrażenia regularnego, jak sugeruje zaakceptowana odpowiedź. Ponieważ w zmiennej, której szukam (lubię.
), mam jakiś znak specjalny i nie muszę ich wymykać podczas używania polecenia.Oto, co robię, chociaż używanie kotwic jest najlepszym sposobem:
źródło
ABB.log
, co nie jest przypadkiem ogólnym, tj. Zwykle zawiedzie.Większość sugestii kończy się niepowodzeniem, jeśli występuje tylko jedna wiodąca lub końcowa spacja, która ma znaczenie, jeśli plik jest edytowany ręcznie. W takim przypadku byłoby to mniej podatne:
Prosta pętla while-read w powłoce zrobiłaby to niejawnie:
źródło
podobnie z awk
źródło
Zamierzam dodać dodatkowe wyjaśnienia dotyczące prób OP i innych odpowiedzi.
Możesz również użyć rozwiązania Johna Kugelmana w następujący sposób:
cytowanie łańcucha i unikanie znaku kropki (
.
) sprawia, że-F
flaga nie jest już potrzebna .Musisz uciec od
.
(kropki) (ponieważ pasuje do dowolnego znaku (nie tylko.
), jeśli nie jest zmieniony) lub użyć-F
flagi z grep.-F
flaga sprawia, że jest to stały ciąg (nie wyrażenie regularne).Jeśli nie podasz cudzysłowu, możesz potrzebować podwójnego odwrotnego ukośnika, aby uniknąć kropki (
.
):Test:
Uwaga:
-x
siły, aby dopasować całą linię..
bez-F
flagi są błędne.-x
zmiany, owijając ciąg wzorca za pomocą^
i$
. W takim przypadku upewnij się, że nie używasz-F
, zamiast tego ucieknij przed.
, ponieważ-F
uniemożliwi to interpretację wyrażeń regularnych^
i$
.EDYCJA: (Dodanie dodatkowego wyjaśnienia w odniesieniu do @hakre):
Jeśli chcesz dopasować ciąg zaczynający się od
-
, powinieneś użyć--
z grep. Cokolwiek nastąpi,--
zostanie przyjęte jako dane wejściowe (nie opcja).Przykład:
źródło
-F
nie będzie potrzebne, jeśli.
zostanie prawidłowo uciec.-F
dostępny, kiedy to pisałeś? Jeśli nie, z jakiego systemu korzystałeś? Do tej pory nie mogłem znaleźć tych informacji w Twojej odpowiedzi, co nawet teraz ma miejsce, gdy ponownie ją czytam. Tak naprawdę, co najmniej dwa razy przeczytałem twoją odpowiedź. ;)-F
było dostępne. (Powiedziałem: „lub użyj-F
flagi zgrep
”)-F
jest odpowiedź, po co zawracać sobie głowę ucieczką? Jaka jest Twoja opinia na ten temat?To działało dobrze, gdy próbowałem zrobić coś podobnego:
źródło
źródło
U mnie działa :
\b
wskazuje / wyznacza granice.Wydaje się, że działa dość szybko
źródło
search_word
oddzielone granicami słów. Na przykład pasowałoby do wiersza „foo search_word bar”.Tak jest w przypadku HPUX, jeśli zawartość plików ma spację między słowami, użyj tego:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
źródło
Wolałbym:
Twoje zdrowie
źródło
ABBxlog
Potrzebowałem tej funkcji, ale chciałem też mieć pewność, że nie zwracam wierszy z prefiksem przed ABB.log:
źródło
\W
jest spełniona, co jest dowolnym znakiem innym niż biały znak, więcxABBxlog
.