Risposte:
Supponendo che cosa realmente intendi è che vuoi eliminare tutto fino agli ultimi due punti e lasciare john.doe
intatto:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
La prima riga esegue il pipe della stringa di test solo a sed
scopo di esempio.
Il secondo è una sed
sostituzione di base . La parte tra il primo e il secondo /
è la regex da cercare e la parte tra il secondo e il terzo è ciò con cui sostituirlo (nulla in questo caso mentre stiamo eliminando).
Per la regex, .
corrisponde a qualsiasi personaggio, lo *
ripete un numero qualsiasi di volte (incluso zero) e :
corrisponde ai due punti. Così efficacemente è tutto seguito da due punti. Dal momento che .*
può includere due punti, la partita è "golosa" e tutto è incluso fino all'ultimo punto.
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Sto sostituendo tutte le occorrenze di : con una scheda e quindi usando awk
per estrarre la stringa john.doe.
Se non hai un file, puoi provare questo.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
Secondo i commenti di Graeme possiamo usare awk
per stampare solo l'ultima colonna usando la NF
variabile di awk
come sotto.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Incorporando i commenti di Graeme per sbarazzarsi di inutili sed
Il comando può essere modificato come di seguito.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
awk
. Fondamentalmente, provo a testare i comandi che originariamente ho ricevuto nella mia risposta e provo a modificarli in base alle esigenze dell'utente. :)
-F
opzione per awk
specifica il separatore di campo. Se si dice awk
di usare i due punti, non è necessario sostituire i due punti con le schede. Inoltre, se si desidera ottenere l'ultimo campo che è possibile utilizzare al $NF
posto di $4
, funzionerebbe se non ci sono sempre 3 punti.
Un altro metodo che utilizza awk
:
awk -F: '{ print $NF }'
Vi preghiamo di provare
modifica: ancora rimossa
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
e per cancellare
echo 'abc:fjk' |sed 's/.*://g'
^
ancoraggio non fa alcuna differenza nel caso della domanda o nel tuo esempio. Qualsiasi indirizzo che inizia con /.*
implica già il ^
.
awk
, perché non farloawk -F:
?