Risposte:
Supponendo che cosa realmente intendi è che vuoi eliminare tutto fino agli ultimi due punti e lasciare john.doeintatto:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
La prima riga esegue il pipe della stringa di test solo a sedscopo di esempio.
Il secondo è una sedsostituzione 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 awkper 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 awkper stampare solo l'ultima colonna usando la NFvariabile di awkcome 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. :)
-Fopzione per awkspecifica il separatore di campo. Se si dice awkdi 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 $NFposto 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:?