เนื่องจากข้อผิดพลาดของแอปพลิเคชั่นที่ยังไม่ได้ถูกเปิดเผยฉันมีเซิร์ฟเวอร์หลายร้อยเครื่องพร้อมดิสก์เต็มรูปแบบ มีไฟล์หนึ่งไฟล์ที่เต็มไปด้วยบรรทัดที่ซ้ำกันไม่ใช่ไฟล์บันทึก แต่เป็นไฟล์สภาพแวดล้อมผู้ใช้ที่มีคำจำกัดความของตัวแปร (ดังนั้นฉันจึงไม่สามารถลบไฟล์ได้)
ฉันเขียนsed
คำสั่งง่ายๆเพื่อตรวจสอบหาบรรทัดที่เพิ่มผิดและลบออกแล้วทดสอบในสำเนาของไฟล์ มันทำงานได้ตามที่ตั้งใจไว้
อย่างไรก็ตามเมื่อฉันลองบนเซิร์ฟเวอร์ด้วยดิสก์เต็มฉันได้รับข้อผิดพลาดดังต่อไปนี้ (มาจากหน่วยความจำไม่ใช่คัดลอกและวาง):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
แน่นอนฉันรู้ว่าไม่มีพื้นที่เหลือ นั่นเป็นเหตุผลที่ฉันพยายามลบเนื้อหา! ( sed
คำสั่งที่ฉันใช้จะลดไฟล์บรรทัด 4000+ เป็นประมาณ 90 บรรทัด)
sed
คำสั่งของฉันเป็นเพียงsed -i '/myregex/d' /path/to/file/filename
มีวิธีที่ฉันสามารถใช้คำสั่งนี้แม้จะมีดิสก์เต็มหรือไม่?
(ต้องเป็นแบบอัตโนมัติเนื่องจากฉันต้องใช้กับเซิร์ฟเวอร์หลายร้อยเครื่องเพื่อแก้ไขปัญหาอย่างรวดเร็ว)
(เห็นได้ชัดว่าข้อผิดพลาดของแอปพลิเคชันจะต้องได้รับการวินิจฉัย แต่ในขณะเดียวกันเซิร์ฟเวอร์ก็ทำงานไม่ถูกต้อง .... )
อัปเดต:สถานการณ์ที่ฉันเผชิญได้รับการแก้ไขโดยการลบสิ่งอื่นที่ฉันพบว่าฉันสามารถลบได้ แต่ฉันยังต้องการคำตอบสำหรับคำถามนี้ซึ่งจะเป็นประโยชน์ในอนาคตและสำหรับคนอื่น ๆ
/tmp
คือไม่ต้องไป มันอยู่ในระบบไฟล์เดียวกัน
ก่อนที่ผมจะอิสระขึ้นพื้นที่ดิสก์ที่ผมได้ทดสอบและพบว่าฉันสามารถลบบรรทัดในvi
โดยการเปิดไฟล์และทำงานแล้วประสบความสำเร็จในการบันทึกการเปลี่ยนแปลงด้วย:g/myregex/d
:wq
ดูเหมือนว่าเป็นไปได้ที่จะทำสิ่งนี้โดยอัตโนมัติโดยไม่ต้องใช้ระบบไฟล์แยกต่างหากเพื่อเก็บไฟล์ temp .... (?)
sed -i
สร้างสำเนาชั่วคราวเพื่อใช้งาน ฉันสงสัยว่าed
มันจะดีกว่าสำหรับเรื่องนี้แม้ว่าฉันจะไม่คุ้นเคยเพียงพอที่จะแก้ปัญหาที่เกิดขึ้นจริง
ed
คุณต้องการเรียกใช้: printf %s\\n g/myregex/d w q | ed -s infile
แต่โปรดทราบว่าการใช้งานบางอย่างยังใช้ไฟล์ชั่วคราวเช่นเดียวกับsed
(คุณสามารถลองใช้busybox ed - afaik มันไม่ได้สร้างไฟล์ชั่วคราว)
echo
/ printf
ใช้ และsed
เพิ่มอักขระที่คุณวางที่บรรทัดสุดท้ายเพื่อให้คุณสามารถหลีกเลี่ยงการสูญเสียช่องว่างต่อท้าย นอกจากนี้เชลล์ของคุณจะต้องสามารถจัดการไฟล์ทั้งหมดในบรรทัดคำสั่งเดียว นั่นคือความเสี่ยงของคุณ - ทดสอบก่อน bash
ไม่ดีโดยเฉพาะอย่างยิ่งที่(ฉันคิดว่ามันจะทำ w / พื้นที่สแต็ค?)และอาจทำให้คุณเมื่อใดก็ได้ sed
อย่างน้อยสองคำแนะนำจะใช้บัฟเฟอร์ท่อของเคอร์เนลเพื่อผลดีระหว่างพวกเขา แต่วิธีการค่อนข้างคล้ายกัน สิ่งย่อยคำสั่งของคุณจะตัดทอนfile
ว่า sed w / in นั้นสำเร็จหรือไม่
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
และถ้ามันใช้ได้โปรดอ่านคำตอบที่เหลือของฉัน '