คำสั่ง Linux และทักษะเชลล์
sed: การแก้ไขสตรีมโดยไม่ต้องเปิดตัวแก้ไข
sed แก้ไขไปด้านข้าง: ข้อความทั้งหมดผ่านไป ออกมาถูกเปลี่ยนรูป และไม่มีโปรแกรมแก้ไขใดเปิดขึ้น ชื่อเสียงของมันมาจาก -i ซึ่งเปลี่ยนการแทนที่บรรทัดเดียวเป็นการดำเนินการแบบแบตช์ในไฟล์หลายพันไฟล์ และจากเรื่องราวภัยพิบัติของผู้ดูแลระบบที่ดำเนินการโดยไม่มีส่วนต่อท้ายสำรอง ขั้นตอนการทำงานที่ปลอดภัยไม่เคยเปลี่ยนแปลง: เรียกใช้การทดแทนที่มองเห็นได้ ยืนยันเอาต์พุต จากนั้นเติม -i ด้วยส่วนต่อท้าย และเก็บโค้ดทางออกไว้
ประเด็นสำคัญ
- ดูตัวอย่างก่อนที่คุณจะคอมมิต: ไฟล์ sed -n '10,20p' จะแสดงช่วงบรรทัด และชุดค่าผสม -n plus p เดียวกันจะพิมพ์เฉพาะบรรทัดที่ตรงกับ regex หรือที่อยู่
- แทนที่ด้วยแฟล็กที่ทำในสิ่งที่คุณหมายถึง: s/old/new/g สำหรับการแข่งขันทั้งหมด ตัวเลขเช่น 2g สำหรับวินาที และ -E สำหรับ regex แบบขยายโดยไม่มีหน้าที่มีเครื่องหมายแบ็กสแลชเป็น Escape
- การแก้ไขแบบแทนที่จะได้รับคำต่อท้าย ไม่มีข้อยกเว้น: แอป sed -i.bak 's/http:/https:/g' จะเก็บข้อมูลสำรองชื่อเดียวกันไว้ข้างๆ ทุกการเปลี่ยนแปลง ส่วนต่อท้ายนั้นได้ช่วยเหลือการปรับใช้มากกว่าประวัติการเลิกทำของเอดิเตอร์
- ตัวคั่นนั้นฟรี: s|/var/www|/srv/app|g (หรือ s#...#g) หลีกเลี่ยงการต่อสู้แบบใช้เครื่องหมายทับเมื่อรูปแบบของคุณเต็มไปด้วยเส้นทาง
- -i ไม่ใช่อะตอมมิก: การแครชหรือ regex ที่ไม่ดีในช่วงกลางแบตช์เมื่อทิ้งไฟล์ที่เขียนใหม่ครึ่งหนึ่งไว้ข้างหลัง ดังนั้นงานจำนวนมากจึงทำงานกับสำเนาหรือทรีที่ติดตามด้วย git ไม่ใช่เพียงสำเนาเดียว
- GNU และ BSD sed ไม่เห็นด้วยกับ -i: BSD ต้องการส่วนต่อท้ายก่อนสคริปต์ (sed -i '' ทำงานบน macOS ไม่ใช่ไวยากรณ์ของ Linux) ซึ่งเป็นอีกเหตุผลหนึ่งที่สคริปต์พกพาหลีกเลี่ยง -i โดยสิ้นเชิง
- Delete และ isolate เป็นคำกริยาที่ตรงไปตรงมา: 'd' ลบบรรทัดที่ตรงกัน (sed '/^#/d' จะตัดความคิดเห็น) และ -n ที่มีช่วงจะแยกส่วน ทั้งคู่อ่านได้ดีกว่าการเปลี่ยนตัวที่ชาญฉลาด
- การแก้ไขบรรทัดเดียวที่ผ่านมา บล็อกหลายบรรทัดตามตัวอักษร หรือการรวมแบบมีสถานะจะอยู่ใน awk หรือสคริปต์จริง การบังคับให้ sed ทำงานของโปรแกรมเมอร์คือสาเหตุที่ทำให้เกิด one-liner ที่ไม่สามารถอ่านได้
บันทึกจากหน้างาน
sed -i ครั้งแรกของฉันที่ไม่มีส่วนต่อท้าย .bak กระทบกับการกำหนดค่า nginx ที่ใช้งานจริงก่อนที่ปริมาณการใช้ข้อมูลในช่วงบ่ายจะถึงจุดสูงสุด ตั้งแต่นั้นมา การแก้ไขแบบแทนที่ทุกครั้งจะมีส่วนต่อท้ายสำรอง และฉันอ่านเอาต์พุตแบบ dry-run ก่อนที่ -i จะเข้าใกล้คำสั่งด้วยซ้ำ
คำถามที่พบบ่อย
ฉันจะแก้ไขเฉพาะบรรทัดที่ตรงกับอย่างอื่นได้อย่างไร
แก้ไขปัญหาเหล่านี้: sed '/cache/s/true/false/' พลิกจริงเป็นเท็จเฉพาะบนบรรทัดแคช และช่วงเช่น '/<VirtualHost>/,/<\/VirtualHost>/s/Old/New/g' แก้ไขขอบเขตเป็นบล็อก ที่อยู่ไปก่อนคำสั่งที่สอง
เหตุใด sed จะไม่ตรงกับจุดสิ้นสุดของบรรทัดในไฟล์ที่แก้ไขด้วย Windows
บรรทัดเหล่านั้นลงท้ายด้วยอักขระการขึ้นบรรทัดใหม่ซึ่งจุดยึด '$' ไม่คาดคิด ตัดออกด้วย tr ก่อนหรือทำให้เป็นมาตรฐานระหว่างทาง และเนื้อหาหลายบรรทัดยังคงเป็น awk หรือ Perl ด้วย -0777
sed เร็วกว่า awk สำหรับการทดแทนแบบง่าย ๆ หรือไม่?
เล็กน้อยและไม่เกี่ยวข้อง; ทั้งสองเสร็จสิ้นในหน่วยมิลลิวินาทีในไฟล์ขนาดกำหนดค่า เลือกตามความสามารถในการอ่าน เนื่องจากเพื่อนร่วมงานต้องแกะซับในของคุณออกภายในหกเดือน
ฉันสามารถแทรกบล็อกการกำหนดค่าทั้งหมดด้วย sed ได้หรือไม่
ใช่: 'a' ต่อท้าย 'i' แทรกข้างหน้า และ 'c' แทนที่บรรทัด แต่ให้ข้อความที่แทรกเรียบง่ายและมีวัตถุประสงค์เดียว บล็อกจริงอยู่ในไฟล์เทมเพลตหรือขั้นตอนการจัดเตรียมที่เหมาะสม
Kinetikatech ช่วยเรื่อง คำสั่ง linux และทักษะเชลล์ ได้อย่างไร
ข้อเสนอง่าย ๆ แบบนี้: คำสั่งและพฤติกรรมการเขียนสคริปต์ที่ตัดสินใจว่าผู้ดูแลระบบจะใช้งานเซิร์ฟเวอร์หรือต่อสู้กับเซิร์ฟเวอร์: ค้นหา แปลง ถ่ายโอน และดูแลข้อความและกระบวนการด้วยเครื่องมือที่อยู่ในทุกการติดตั้งฐาน ส่งให้บริการ ความปลอดภัยเซิร์ฟเวอร์ Linuxและการจัดการเซิร์ฟเวอร์ ของเราดูแล มีการประเมินอย่างเหมาะสม ลงมือแบบสะอาด และมีคนเฝ้าตลอด 24 ชั่วโมง