15 เคล็ดลับคำสั่ง Sed สำหรับงานการดูแลระบบ Linux
ผู้ดูแลระบบทุกคนต้องจัดการกับไฟล์ข้อความธรรมดาทุกวัน การรู้วิธีดูบางส่วน วิธีแทนที่คำ และวิธีกรองเนื้อหาจากไฟล์เหล่านั้นเป็นทักษะที่คุณจำเป็นต้องมีโดยไม่ต้องค้นหาด้วย Google
ในบทความนี้ เราจะมาทบทวน sed โปรแกรมแก้ไขสตรีมที่มีชื่อเสียง และแบ่งปันเคล็ดลับ 15 ข้อในการใช้งานเพื่อให้บรรลุเป้าหมายที่กล่าวไว้ข้างต้น และอื่นๆ อีกมากมาย
คำสั่ง Sed คืออะไร?
คำสั่ง 'sed' ย่อมาจากโปรแกรมแก้ไขสตรีม เป็นเครื่องมือจัดการข้อความที่หลากหลายและมีประสิทธิภาพ ซึ่งทำงานบนสตรีมข้อความ ทำให้ผู้ใช้สามารถดำเนินการต่างๆ กับข้อมูล เช่น ค้นหา แทนที่ แทรก และ ลบ. 'Sed' ใช้นิพจน์ทั่วไปเพื่อกำหนดรูปแบบสำหรับการจัดการข้อความ และสามารถนำมาใช้สำหรับงานแก้ไขเป็นกลุ่มและการประมวลผลข้อความในสคริปต์
หนึ่งในคุณสมบัติที่โดดเด่นคือการแก้ไขแบบแทนที่ ซึ่งสามารถแก้ไขไฟล์ได้โดยตรงหรือสร้างสำเนาสำรองในขณะที่ทำการเปลี่ยนแปลง 'Sed' เป็นเครื่องมือสำคัญสำหรับผู้ดูแลระบบ โปรแกรมเมอร์ และใครก็ตามที่เกี่ยวข้องกับการแปลงข้อความและงานจัดการข้อมูลในบรรทัดคำสั่ง
ต่อไปนี้เป็นคำสั่ง 'sed' ทั่วไปพร้อมตัวอย่าง:
1. การดูช่วงบรรทัดของไฟล์
เครื่องมือเช่นหัวและส่วนท้ายทำให้เราสามารถดูด้านล่างหรือด้านบนของไฟล์ได้ จะทำอย่างไรถ้าเราจำเป็นต้องดูส่วนที่อยู่ตรงกลาง? sed one-liner ต่อไปนี้จะส่งคืนบรรทัด 5 ถึง 10 จาก tecmint.txt:
sed -n '5,10p' tecmint.txt
2. การดูไฟล์ทั้งหมดยกเว้นช่วงที่กำหนด
ในทางกลับกัน อาจเป็นไปได้ว่าคุณต้องการพิมพ์ทั้งไฟล์ยกเว้นบางช่วง หากต้องการแยกบรรทัด 20 ถึง 35 จาก tecmint.txt ให้ทำดังนี้
sed '20,35d' myfile.txt
3. การดูเส้นและช่วงที่ไม่ต่อเนื่องกัน
อาจเป็นไปได้ว่าคุณสนใจชุดของเส้นที่ไม่ต่อเนื่องกัน หรือมากกว่าหนึ่งช่วง มาแสดงเส้น 5-7 และ 10-13 จาก tecmint.txt:
sed -n -e '5,7p' -e '10,13p' tecmint.txt
อย่างที่คุณเห็น ตัวเลือก -e
ช่วยให้เราสามารถดำเนินการตามที่กำหนด (ในกรณีนี้คือบรรทัดที่พิมพ์) สำหรับแต่ละช่วง
4. การแทนที่คำหรือสตริงในไฟล์
หากต้องการแทนที่ทุกอินสแตนซ์ของคำว่า version
ด้วย story
ใน tecmint.txt ให้ทำดังนี้
sed 's/version/story/g' tecmint.txt
นอกจากนี้ คุณอาจต้องการพิจารณาใช้ gi
แทน g
เพื่อละเว้นตัวพิมพ์:
sed 's/version/story/gi' myfile.txt
หากต้องการแทนที่ช่องว่างหลายช่องด้วยช่องว่างเดียว เราจะใช้เอาต์พุตของคำสั่ง ip route show ด้วยไปป์ไลน์:
ip route show | sed 's/ */ /g'
เปรียบเทียบผลลัพธ์ของ การแสดงเส้นทาง ip
ที่มีและไม่มีไปป์ไลน์:
5. การแทนที่คำหรือสตริงภายในช่วง
หากคุณสนใจที่จะแทนที่คำเฉพาะในช่วงบรรทัด (เช่น 30 ถึง 40) คุณสามารถทำได้:
sed '30,40 s/version/story/g' tecmint.txt
แน่นอน คุณสามารถระบุบรรทัดเดียวผ่านหมายเลขที่เกี่ยวข้องแทนช่วงได้
6. ลบความคิดเห็นออกจากไฟล์
บางครั้งไฟล์การกำหนดค่าจะเต็มไปด้วยความคิดเห็น แม้ว่าสิ่งนี้จะมีประโยชน์อย่างแน่นอน แต่การแสดงเฉพาะคำสั่งการกำหนดค่าในบางครั้งอาจเป็นประโยชน์หากคุณต้องการดูทั้งหมดโดยสรุป
หากต้องการลบบรรทัดว่างหรือบรรทัดที่ขึ้นต้นด้วย #
ออกจากไฟล์การกำหนดค่า Apache ให้ทำดังนี้
sed '/^#\|^$\| *#/d' httpd.conf
เครื่องหมายรูปหมวกตามด้วยเครื่องหมายตัวเลข (^#)
แสดงถึงจุดเริ่มต้นของบรรทัด ในขณะที่ ^$
แสดงถึงบรรทัดว่าง แถบแนวตั้งระบุถึงการดำเนินการบูลีน ในขณะที่เครื่องหมายทับด้านหลังใช้เพื่อแยกแถบแนวตั้ง
ในกรณีนี้ ไฟล์การกำหนดค่า Apache มีบรรทัดที่มี #’s
ไม่ใช่จุดเริ่มต้นของบางบรรทัด ดังนั้นจึงใช้ *#
เพื่อลบบรรทัดเหล่านั้นเช่นกัน
7. แทนที่คำที่ไม่คำนึงถึงขนาดตัวพิมพ์ในไฟล์
หากต้องการแทนที่คำที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กด้วยคำอื่น เราสามารถใช้ sed ได้เช่นกัน เพื่อให้เห็นภาพ ลองแทนที่คำว่า zip หรือ Zip ด้วย rar ใน tecmint.txt:
sed 's/[Zz]ip/rar/g' tecmint.txt
8. การค้นหาเหตุการณ์เฉพาะในไฟล์บันทึก
การใช้ sed อีกประการหนึ่งคือการพิมพ์บรรทัดจากไฟล์ที่ตรงกับนิพจน์ทั่วไปที่กำหนด ตัวอย่างเช่น เราอาจสนใจดูกิจกรรม การอนุญาต และ การตรวจสอบสิทธิ์ ที่เกิดขึ้นในวันที่ 2 กรกฎาคม ตาม /var /log/secure เข้าสู่ระบบเซิร์ฟเวอร์ CentOS
ในกรณีนี้ รูปแบบที่จะค้นหาคือ 2 กรกฎาคม ที่ตอนต้นของแต่ละบรรทัด:
sed -n '/^Jul 1/ p' /var/log/secure
9. การแทรกช่องว่างหรือบรรทัดว่างในไฟล์
ด้วย sed เราสามารถแทรกช่องว่าง (บรรทัดว่าง) สำหรับแต่ละบรรทัดที่ไม่ว่างในไฟล์ได้ หากต้องการแทรกบรรทัดว่างหนึ่งบรรทัดลงในไฟล์ข้อความธรรมดา LICENSE ให้ทำดังนี้
sed G tecmint.txt
หากต้องการแทรกสองบรรทัดว่าง ให้ทำดังนี้
sed 'G;G' tecmint.txt
เพิ่ม ตัวพิมพ์ใหญ่ G คั่นด้วยเครื่องหมายอัฒภาค หากคุณต้องการเพิ่มบรรทัดว่าง รูปภาพต่อไปนี้แสดงตัวอย่างที่ระบุไว้ในเคล็ดลับนี้:
เคล็ดลับนี้อาจมีประโยชน์หากคุณต้องการตรวจสอบไฟล์การกำหนดค่าขนาดใหญ่ การแทรกช่องว่างทุกบรรทัดและการวางท่อเอาต์พุตให้น้อยลงจะทำให้ประสบการณ์การอ่านเป็นมิตรมากขึ้น
10. การลบ ^M ในไฟล์
โปรแกรม dos2unix แปลงไฟล์ข้อความธรรมดาจากการจัดรูปแบบ Windows/Mac เป็น Unix/Linux โดยลบอักขระขึ้นบรรทัดใหม่ที่ซ่อนอยู่ซึ่งแทรกโดยโปรแกรมแก้ไขข้อความบางตัวที่ใช้ในแพลตฟอร์มเหล่านั้น หากไม่ได้ติดตั้งในระบบ Linux ของคุณ คุณสามารถเลียนแบบการทำงานของระบบด้วย sed แทนการติดตั้ง
ในภาพด้านซ้าย เราจะเห็นอักขระขึ้นบรรทัดใหม่ของ DOS หลายตัว (^M)
ซึ่งต่อมาถูกลบออกด้วย:
sed -i 's/\r//' myfile.txt
โปรดทราบว่าตัวเลือก -i
บ่งชี้ถึงการแก้ไขแบบแทนที่ จากนั้นการเปลี่ยนแปลงจะไม่ถูกส่งกลับไปยังหน้าจอ แต่จะถูกบันทึกลงในไฟล์
หมายเหตุ: คุณสามารถแทรกอักขระขึ้นบรรทัดใหม่ของ DOS ในขณะที่แก้ไขไฟล์ในตัวแก้ไข Vim ด้วย Ctrl+V
และ Ctrl+M
11. สร้างไฟล์สำรองข้อมูลด้วยคำสั่ง Sed
ในเคล็ดลับก่อนหน้านี้ เราใช้ sed เพื่อแก้ไขไฟล์ แต่ไม่ได้บันทึกไฟล์ต้นฉบับ บางครั้งเป็นความคิดที่ดีที่จะบันทึกสำเนาสำรองของไฟล์ต้นฉบับไว้เผื่อไว้
ในการทำเช่นนั้น ให้ระบุส่วนต่อท้ายตามตัวเลือก -i
(ภายในเครื่องหมายคำพูดเดี่ยว) เพื่อใช้ในการเปลี่ยนชื่อไฟล์ต้นฉบับ
ในตัวอย่างต่อไปนี้ เราจะแทนที่อินสแตนซ์ทั้งหมดของ สิ่งนี้ หรือ สิ่งนี้ (ไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ด้วยสิ่งนั้นใน myfile.txt และเราจะบันทึก ไฟล์ต้นฉบับเป็น myfile.txt.orig
สุดท้ายนี้ เราจะใช้ยูทิลิตี้ diff เพื่อระบุความแตกต่างระหว่างไฟล์ทั้งสอง:
sed -i'.orig' 's/this/that/gi' myfile.txt
12. การสลับคู่คำในไฟล์
สมมติว่าคุณมีไฟล์ที่มีชื่อเต็มในรูปแบบ ชื่อ, นามสกุล เพื่อให้ประมวลผลไฟล์ได้อย่างเพียงพอ คุณอาจต้องการสลับ นามสกุล และ ชื่อ
เราสามารถทำได้ด้วย sed ค่อนข้างง่าย:
sed 's/^\(.*\),\(.*\)$/\, /g' names.txt
ในภาพด้านบน เราจะเห็นว่าวงเล็บซึ่งเป็นอักขระพิเศษ จำเป็นต้องหลีกเลี่ยง เช่นเดียวกับตัวเลข 1 และ 2
ตัวเลขเหล่านี้แสดงถึงนิพจน์ทั่วไปที่ไฮไลต์ (ซึ่งต้องปรากฏในวงเล็บ):
- 1 หมายถึงจุดเริ่มต้นของแต่ละบรรทัดจนถึงเครื่องหมายจุลภาค
- 2 คือตัวยึดตำแหน่งสำหรับทุกสิ่งที่อยู่ทางขวาของเครื่องหมายจุลภาคจนถึงจุดสิ้นสุดของบรรทัด
ผลลัพธ์ที่ต้องการจะแสดงในรูปแบบ SecondColumn (นามสกุล) + เครื่องหมายจุลภาค + เว้นวรรค + FirstColumn (ชื่อ) รู้สึกอิสระที่จะเปลี่ยนเป็นสิ่งที่คุณต้องการ
13. การแทนที่คำเฉพาะในกรณีที่พบการจับคู่ที่แยกจากกัน
บางครั้งการแทนที่ทุกกรณีของคำที่กำหนดหรือการสุ่มตัวอย่างบางส่วน อาจไม่ใช่สิ่งที่เราต้องการอย่างแน่นอน บางทีเราอาจจำเป็นต้องดำเนินการทดแทนหากพบการจับคู่ที่แยกจากกัน
ตัวอย่างเช่น เราอาจต้องการแทนที่ เริ่มต้น ด้วย หยุด เฉพาะเมื่อพบบริการคำในบรรทัดเดียวกัน ในสถานการณ์นั้น สิ่งที่จะเกิดขึ้นมีดังนี้:
We need to start partying at work,
but let’s remember to start all services first.
ในบรรทัดแรก เริ่มต้น จะไม่ถูกแทนที่ด้วย หยุด เนื่องจากคำว่า services ไม่ปรากฏในบรรทัดนั้น ตรงข้ามกับบรรทัดที่สอง
sed '/services/ s/start/stop/g' msg.txt
14. การเปลี่ยนตัวผู้เล่นสองคนขึ้นไปพร้อมกัน
คุณสามารถรวมการแทนที่ตั้งแต่สองตัวขึ้นไปในคำสั่ง sed คำสั่งเดียว มาแทนที่คำนั้นและบรรทัดใน myfile.txt ด้วย This และ verse ตามลำดับ
โปรดสังเกตว่าสามารถทำได้โดยใช้คำสั่งการแทนที่ sed ธรรมดา ตามด้วยเครื่องหมายอัฒภาคและคำสั่งการแทนที่ที่สอง:
sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt
เคล็ดลับนี้แสดงไว้ในรูปภาพต่อไปนี้:
15. การรวม Sed และคำสั่งอื่น ๆ
แน่นอนว่า sed สามารถใช้ร่วมกับคำสั่ง Linux อื่นๆ เพื่อสร้างคำสั่งที่มีประสิทธิภาพยิ่งขึ้นได้ ตัวอย่างเช่น ลองใช้ตัวอย่างที่ให้ไว้ใน เคล็ดลับ #4 และแยกที่อยู่ IP ของเราออกจากเอาต์พุตของคำสั่ง เส้นทาง ip
เราจะเริ่มต้นด้วยการพิมพ์เฉพาะบรรทัดที่มีคำว่า src
อยู่ จากนั้นเราจะแปลงช่องว่างหลายช่องให้เป็นช่องเดียว สุดท้าย เราจะตัดฟิลด์ ที่ 9 (โดยพิจารณาช่องว่างเดียวเป็นตัวคั่นฟิลด์) ซึ่งเป็นที่อยู่ IP:
ip route show | sed -n '/src/p' | sed -e 's/ */ /g' | cut -d' ' -f9
รูปภาพด้านล่างแสดงแต่ละขั้นตอนของคำสั่งข้างต้น:
สรุป
ในคู่มือนี้ เราได้แบ่งปัน เคล็ดลับและคำแนะนำ 15 ข้อ เพื่อช่วยคุณในงานการดูแลระบบในแต่ละวัน มีเคล็ดลับอื่นใดที่คุณใช้เป็นประจำและต้องการแบ่งปันกับเราและคนอื่นๆ ในชุมชนหรือไม่
หากเป็นเช่นนั้น โปรดแจ้งให้เราทราบโดยใช้แบบฟอร์มความคิดเห็นด้านล่าง ยินดีต้อนรับคำถามและความคิดเห็น - เราหวังว่าจะได้รับการติดต่อจากคุณ!