lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (ลบ \) $ / {printf“> / proc /% s / fd /% d \ n”, $ 2, $ 4}' ค่าเฉลี่ย


9

ฉันกำลังอ่านบทความและฉันเห็นคำสั่งนี้:

lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

ร่างกายบางคนสามารถช่วยให้ฉันเข้าใจมันได้


+1 และรายการโปรดเนื่องจากเป็นคำถามที่น่าสนใจ :-)
Lorenzo Ancora

คำตอบ:


7

คำสั่งนี้จะพิมพ์ไฟล์จากlsofที่ต้องการตัดทอน

(อันที่จริงมันไม่ได้ลบหรือตัดทอนไฟล์ใด ๆ )

lsof จะส่งคืนรายการไฟล์ที่เปิด (ตัวอธิบายไฟล์) ที่ถูกไพพ์ลงใน awk ซึ่งประมวลผลดังต่อไปนี้

gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

นิพจน์ด้านบนมีนิพจน์ทั่วไปสองนิพจน์คั่นด้วยเซมิโคลอน ;

ให้พิจารณาส่วนแรก gawk '$4~/txt/{next};

ที่นี่หากฟิลด์ที่ 4 มีtxtข้อความบรรทัดถัดไปจะถูกอ่านซึ่งสคริปต์จะเริ่มประมวลผลตั้งแต่ต้นอีกครั้ง

nextกองกำลังงบ awk จะหยุดทันทีประมวลผลระเบียนปัจจุบันและต่อไปยังระเบียนถัดไป ซึ่งหมายความว่าจะไม่มีการดำเนินการกฎเพิ่มเติมสำหรับระเบียนปัจจุบันและการดำเนินการที่เหลือของกฎปัจจุบันจะไม่ถูกดำเนินการ

ตอนนี้ให้พิจารณาส่วนที่สองของสคริปต์ /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

ที่นี่หากบรรทัดตรงกับนิพจน์ทั่วไป/REG.*\(deleted\)$( $หมายความว่า(deleted)ควรเป็นคำสุดท้ายในบรรทัด) มันจะพิมพ์>/proc/%s/fd/%d\n", $2,$4ออกมา

ในคำสั่ง lsof $4เป็นจำนวนไฟล์อธิบาย (ตัวอย่างเช่น53wที่wหมายถึง filer ได้รับการเปิดสำหรับการเขียน) หรือ filetype ขึ้นอยู่กับไฟล์ %dในprintfเพื่อให้แน่ใจว่ามีเพียงตัวเลขจะถูกพิมพ์ออกตัวอักษรข้อความใด ๆ (เช่นw) $2พิมพ์ id กระบวนการของกระบวนการที่ใช้ไฟล์ดังนั้นมันจะพิมพ์สิ่งที่ชอบ>/proc/3989/fd/53และอื่น ๆ มันจะพิมพ์ไฟล์ทั้งหมดที่ถูกลบ แต่ที่มีคำอธิบายไฟล์ที่ยังคงเปิดอยู่ในคำอื่น ๆ อธิบายไฟล์ที่สามารถตัดทอนอย่างปลอดภัย


2

คำสั่งนี้จะตัดไฟล์ที่ถูกลบออกจาก lsof

ครั้งแรกนี้จะแสดงรายการไฟล์ที่เปิดlsof

จากนั้นค้นหาบรรทัดซ้ำหนึ่งบรรทัด{next}ที่มี REG '$4~/txt/{next};/REG.*\(deleted\)$/เป็นพารามิเตอร์ตัวที่สี่กระบวนการนี้ที่สัมพันธ์กับบรรทัดนี้จะถูกลบ

จากนั้นพิมพ์ผลลัพธ์ทั้งหมดโดยไม่มีบรรทัดที่มี REG และทำเครื่องหมายว่าถูกลบ{printf ">/proc/%s/fd/%d\n", $2,$4}'


ฉันคิดว่าคุณควรอธิบายส่วนต่าง ๆ ของคำสั่ง (อย่างน้อยเพื่อรับ upvote ของฉัน)
don.joey

ตรวจสอบการอัปเดตของฉัน

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