Mam sznurek
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
i chcą, aby wyodrębnić słowa qa
, który następuje -Dspring.profiles.active
.
Mam zapis łańcucha w pliku text.txt, aby go tylko wypróbować.
Kiedy robię
grep -r -o "spring.profiles.active=" text.txt
Wynik to spring.profiles.active=
To słowo nie zawsze jest qa
, może być prod
lub dev
.
Co chciałbym zrobić, to znaleźć wyraz spring.profiles.active
i po tym =
ekstrakcie tego słowa.
Chciałbym to zrobić za pomocą skryptu, ponieważ używam tego słowa do konfigurowania innych elementów na serwerze.
Czy to możliwe, a jeśli tak, to jak to zrobić.
Odpowiedzi:
Możesz używać
grep
z PCRE (-P
):spring.profiles.active=
dopasuje ten podciąg dosłownie,\K
odrzuci dopasowanie[^ ]+
wybierze żądaną część, tj. część pospring.profiles.active=
, aż do następnej spacjiDla pliku:
Przykład:
sed
przyjąłby podobną logikę:Przykład:
Błędy obsługi:
W skrypcie możesz poradzić sobie z przypadkiem, w którym nie ma zgodności, innymi słowy, gdy oryginalny ciąg nie zawiera
spring.profiles.active=
. W powyższymsed
przykładzie otrzymujesz cały oryginalny ciąg, co może powodować problemy:Jeśli wolisz uzyskać pusty ciąg, gdy nie ma zgodności, dodaj
-n
opcję dosed
polecenia ip
opcję dosed
s
polecenia, w następujący sposób:Następnie możesz sprawdzić, czy $ var jest puste, czy nie.
źródło
var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"
wymienićfile.txt
ze<<<'...string...'
jeśli wejście jest ciągiem znaków, a nie file..then można zrobićif [ "$var" = 'qa' ]; then do something; else do something; fi
Za pomocą
awk
lub
Przykład
źródło
Wrzucę Perla do miksu:
-l
: umożliwia automatyczne przetwarzanie końca linii. Ma dwa osobne efekty. Po pierwsze, automatycznie używa komendy $ / (separator rekordów wejściowych), gdy jest używana z -n lub -p. Po drugie, przypisuje $ \ (separator rekordu wyjściowego), aby miał wartość octnum, dzięki czemu wszelkie instrukcje drukowania będą miały ponownie dodany separator. Jeśli octnum zostanie pominięty, ustawia $ \ na bieżącą wartość $ /.-a
: włącza tryb automatycznego podziału, gdy jest używany z -n lub -p. Ujawnione polecenie podziału na tablicę @F jest wykonywane jako pierwsza rzecz w niejawnej pętli while generowanej przez -n lub -p.n
: powoduje, że Perl zakłada następującą pętlę wokół twojego programu, co powoduje iterację argumentów nazw plików, takich jak sed -n lub awk:-e
: może być użyty do wprowadzenia jednego wiersza programu.źródło
perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'