Câu trả lời:
Điều này có thể được thực hiện với cut:
cut -d _ -f 1
ví dụ
$ echo host100_044 2 | cut -d _ -f 1
host100
Ngoài ra với awkcó thể được thực hiện với awk -F_ '{print $1}'(có thể có một cách sạch hơn để làm điều đó)
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}' | cut -d ' ' -f2-
Đầu ra:
host100 host101 host102
Với dòng mới:
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'
Đầu ra:
host100
host101
host102
Sử dụng sed:
echo host100_044 2 | sed 's;_.*;;'
Sử dụng sedtùy chọn chỉnh sửa tại chỗ,
sed -i.old 's;_.*;;' infile
awkgiải pháp đã được đăng (và cutcó lẽ là tốt nhất trong trường hợp này), vì anh ấy đã hỏi sed, nhưng bạn đã đánh bại tôi trong vài giây :-). Bạn thậm chí có thể loại bỏ $, vì nó sẽ khớp .*với cuối dòng theo mặc định.
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100
Các -F'_'hướng dẫn awksử dụng dấu gạch dưới làm dấu phân cách trường. Bản awkthân kịch bản chỉ in trường đầu tiên.
Điều này sẽ in đầu ra trước _:
sed 's/_.*//' -filename