Jawaban:
Dengan asumsi apa yang Anda maksud sebenarnya adalah bahwa Anda ingin menghapus semuanya hingga titik dua terakhir dan membiarkannya john.doe
tetap utuh:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
Baris pertama hanya memipihkan string uji ke sed
untuk tujuan contoh.
Yang kedua adalah sed
substitusi dasar . Bagian antara yang pertama dan yang kedua /
adalah regex untuk dicari dan bagian antara yang kedua dan ketiga adalah apa yang harus diganti (tidak ada dalam hal ini seperti yang kita hapus).
Untuk regex, .
cocok dengan karakter apa pun, *
ulangi ini beberapa kali (termasuk nol) dan :
cocok dengan tanda titik dua. Jadi secara efektif itu adalah apa pun yang diikuti oleh titik dua. Karena .*
dapat menyertakan titik dua, pertandingan 'serakah' dan semuanya hingga titik dua terakhir termasuk.
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Saya mengganti semua kemunculan : dengan tab dan kemudian gunakan awk
untuk mengekstrak string john.doe.
Jika Anda tidak memiliki file, Anda dapat mencoba ini.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
Sesuai komentar Graeme, kita dapat menggunakan awk
untuk mencetak kolom terakhir sendiri menggunakan NF
variabel awk
seperti di bawah ini.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Menggabungkan komentar Graeme untuk menghilangkan yang tidak perlu sed
Perintah dapat dimodifikasi seperti di bawah ini.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
awk
. Pada dasarnya, saya mencoba untuk menguji perintah yang saya dapatkan pada jawaban saya dan mencoba untuk memodifikasinya sesuai dengan kebutuhan pengguna. :)
-F
pilihan untuk awk
menentukan pemisah lapangan. Jika Anda meminta awk
untuk menggunakan titik dua, tidak perlu mengganti titik dua dengan tab. Juga, jika Anda ingin mendapatkan bidang terakhir yang dapat Anda gunakan, $NF
bukan $4
, ini akan berfungsi jika tidak selalu ada 3 titik dua.
Metode lain menggunakan awk
:
awk -F: '{ print $NF }'
Silakan dicoba
edit: jangkar dihapus
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
dan untuk menghapus
echo 'abc:fjk' |sed 's/.*://g'
^
jangkar tidak membuat perbedaan dalam hal baik pertanyaan atau dalam kasus contoh Anda. Alamat apa pun yang dimulai dengan /.*
sudah menyiratkan ^
.
awk
, mengapa tidak lakukanawk -F:
?