ค้นหาเว็บไซต์

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 ข้อ เพื่อช่วยคุณในงานการดูแลระบบในแต่ละวัน มีเคล็ดลับอื่นใดที่คุณใช้เป็นประจำและต้องการแบ่งปันกับเราและคนอื่นๆ ในชุมชนหรือไม่

หากเป็นเช่นนั้น โปรดแจ้งให้เราทราบโดยใช้แบบฟอร์มความคิดเห็นด้านล่าง ยินดีต้อนรับคำถามและความคิดเห็น - เราหวังว่าจะได้รับการติดต่อจากคุณ!