ฉันจะใช้ awk หรือ sed เพื่อพิมพ์สตริงได้จนถึงอักขระขีดล่างตัวแรกเท่านั้นได้อย่างไร
ก่อน:
host100_044 2
host101_045 2
host102_046 2
หลังจาก:
host100
host101
host102
ฉันจะใช้ awk หรือ sed เพื่อพิมพ์สตริงได้จนถึงอักขระขีดล่างตัวแรกเท่านั้นได้อย่างไร
ก่อน:
host100_044 2
host101_045 2
host102_046 2
หลังจาก:
host100
host101
host102
คำตอบ:
สามารถทำได้ด้วยcut
:
cut -d _ -f 1
เช่น
$ echo host100_044 2 | cut -d _ -f 1
host100
นอกจากนี้ยังawk
สามารถทำได้ด้วยawk -F_ '{print $1}'
(อาจมีวิธีที่สะอาดกว่าในการทำเช่นนั้น)
ทางเลือกอื่นสำหรับ sed:
echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'
หากคุณมีสิ่งเหล่านี้ในไฟล์คุณสามารถเรียกมันได้ดังนี้
cat fileName | sed 's/^\(.*\)_.*$/\1/'
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}' | cut -d ' ' -f2-
เอาท์พุท:
host100 host101 host102
ด้วยการขึ้นบรรทัดใหม่:
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'
เอาท์พุท:
host100
host101
host102
การใช้sed
:
echo host100_044 2 | sed 's;_.*;;'
ใช้sed
ตัวเลือกการแก้ไขในสถานที่
sed -i.old 's;_.*;;' infile
awk
วิธีการแก้ปัญหาจะโพสต์แล้ว (และcut
อาจจะดีที่สุดในกรณีนี้) เนื่องจากเขาถามถึงsed
แต่คุณเอาชนะฉันด้วยวินาที :-) คุณยังสามารถตัดแถบ$
เนื่องจากจะจับคู่.*
กับจุดสิ้นสุดของบรรทัดโดยค่าเริ่มต้น
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100
-F'_'
สั่งawk
กับการใช้ขีดเป็นตัวคั่นฟิลด์ awk
สคริปต์ตัวเองเพียงแค่พิมพ์ฟิลด์แรก
สิ่งนี้จะพิมพ์ผลลัพธ์ก่อน_
:
sed 's/_.*//' -filename