awk / sed เพื่อพิมพ์อักขระที่ขีดล่างเท่านั้น


10

ฉันจะใช้ awk หรือ sed เพื่อพิมพ์สตริงได้จนถึงอักขระขีดล่างตัวแรกเท่านั้นได้อย่างไร

ก่อน:

host100_044 2
host101_045 2
host102_046 2

หลังจาก:

host100
host101
host102

คำตอบ:


20

สามารถทำได้ด้วยcut:

cut -d _ -f 1

เช่น

$ echo host100_044 2 | cut -d _ -f 1
host100

นอกจากนี้ยังawkสามารถทำได้ด้วยawk -F_ '{print $1}'(อาจมีวิธีที่สะอาดกว่าในการทำเช่นนั้น)


@Renan ฉันจะแก้ไขฟังก์ชั่นการตัดนี้ได้อย่างไรหากฉันต้องการให้เอาต์พุตมีข้อมูลอินพุตทั้งหมดนอกเหนือจากการทำการตัด
BioMan

2

ทางเลือกอื่นสำหรับ sed:

echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'

หากคุณมีสิ่งเหล่านี้ในไฟล์คุณสามารถเรียกมันได้ดังนี้

cat fileName | sed 's/^\(.*\)_.*$/\1/'

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

1

การใช้sed:

echo host100_044 2 | sed 's;_.*;;'


ใช้sedตัวเลือกการแก้ไขในสถานที่

sed -i.old 's;_.*;;' infile

เป็นเพียงการเขียนเหมือนกันแม้ว่าawkวิธีการแก้ปัญหาจะโพสต์แล้ว (และcutอาจจะดีที่สุดในกรณีนี้) เนื่องจากเขาถามถึงsedแต่คุณเอาชนะฉันด้วยวินาที :-) คุณยังสามารถตัดแถบ$เนื่องจากจะจับคู่.*กับจุดสิ้นสุดของบรรทัดโดยค่าเริ่มต้น
Daniel Andersson


1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

-F'_'สั่งawkกับการใช้ขีดเป็นตัวคั่นฟิลด์ awkสคริปต์ตัวเองเพียงแค่พิมพ์ฟิลด์แรก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.