Câu trả lời:
Giả sử điều bạn thực sự muốn nói là bạn muốn xóa mọi thứ cho đến dấu hai chấm cuối cùng và để john.doe
nguyên vẹn:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
Dòng đầu tiên chỉ dẫn các chuỗi thử nghiệm sed
cho các mục đích ví dụ.
Thứ hai là một sed
sự thay thế cơ bản . Phần giữa thứ nhất và thứ hai /
là regex để tìm kiếm và phần giữa thứ hai và thứ ba là những gì để thay thế nó (không có gì trong trường hợp này khi chúng tôi đang xóa).
Đối với regex, .
khớp với bất kỳ ký tự nào, *
lặp lại số lần này (bao gồm 0) và :
khớp với dấu hai chấm. Vì vậy, hiệu quả của nó là bất cứ điều gì theo sau một dấu hai chấm. Vì .*
có thể bao gồm một dấu hai chấm, trận đấu là 'tham lam' và mọi thứ cho đến dấu hai chấm cuối cùng được bao gồm.
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Tôi đang thay thế tất cả các lần xuất hiện của : bằng một tab và sau đó sử dụng awk
để trích xuất chuỗi john.doe.
Nếu bạn không có tập tin, bạn có thể thử nó.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
Theo nhận xét của Graeme, chúng tôi có thể sử dụng awk
để in cột cuối cùng bằng cách sử dụng NF
biến awk
như dưới đây.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Kết hợp các ý kiến của Graeme để loại bỏ những thứ không cần thiết sed
Lệnh có thể được sửa đổi như dưới đây.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
awk
. Về cơ bản, tôi cố gắng kiểm tra các lệnh mà ban đầu tôi nhận được trong câu trả lời của mình và cố gắng sửa đổi chúng theo yêu cầu của người dùng. :)
-F
lựa chọn cho awk
quy định cụ thể tách lĩnh vực. Nếu bạn bảo awk
sử dụng dấu hai chấm, không cần thay dấu hai chấm bằng tab. Ngoài ra, nếu bạn muốn lấy trường cuối cùng bạn có thể sử dụng $NF
thay vì $4
, trường này sẽ hoạt động nếu không phải lúc nào cũng có 3 dấu hai chấm.
Một phương pháp khác sử dụng awk
:
awk -F: '{ print $NF }'
Vui lòng thử
chỉnh sửa: loại bỏ neo
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
và xóa
echo 'abc:fjk' |sed 's/.*://g'
^
neo làm cho không có sự khác biệt trong trường hợp một trong hai của câu hỏi hoặc trong trường hợp ví dụ của bạn. Bất kỳ địa chỉ bắt đầu với /.*
đã ngụ ý ^
.
awk
, tại sao không làmawk -F:
?