คำสั่งเพื่อลบจำนวน N บรรทัดแรกในอินพุต


11

พื้นหลัง

ฉันใช้เซิร์ฟเวอร์ SSH และมีผู้ใช้ที่ฉันต้องการลบ ฉันไม่สามารถลบผู้ใช้รายนี้ได้เนื่องจากเขากำลังใช้งานกระบวนการบางอย่างที่ฉันต้องฆ่าเสียก่อน

นี่คือขั้นตอนที่ฉันใช้อยู่ในขณะนี้เพื่อค้นหารหัสกระบวนการทั้งหมดของผู้ใช้ที่ฉันกำลังใช้:

ps -u user | awk '{print $1;}'

ผลลัพธ์มีลักษณะดังนี้:

PID
2121
2122
2124
2125
2369
2370

ฉันต้องการไปป์นี้เพื่อkill -9ฆ่ากระบวนการทั้งหมดเพื่อให้ฉันสามารถลบผู้ใช้ที่โง่เช่นนี้:

ps -u user | awk '{print $1;}' | sudo xargs kill -9

แต่สิ่งนี้ไม่ทำงานเนื่องจากPIDหัวข้อ:

kill: failed to parse argument: 'PID'

คำถาม

ฉันคิดว่าจะต้องมีคำสั่ง Unix ง่าย ๆ เพื่อลบบรรทัดแรกของอินพุต

ฉันรู้ว่าฉันสามารถใช้ tailสิ่งนี้ได้ แต่ฉันไม่ต้องการนับจำนวนบรรทัดที่อินพุตมีเพื่อคำนวณจำนวนที่ฉันต้องการแสดง

ฉันกำลังมองหาบางสิ่งที่ชอบheadหรือtailคว่ำ แต่แทนที่จะแสดงเฉพาะส่วนแรก / สุดท้ายของสตรีมที่แสดงทุกอย่างยกเว้นส่วนเริ่มต้น / สิ้นสุดของสตรีม

บันทึก

ฉันจัดการเพื่อแก้ไขปัญหานี้ได้โดยเพียงเพิ่มคำสั่ง| grep [[:digit:]]ของฉันawkแต่ฉันยังคงมองหาวิธีการลบบรรทัดแรกของไฟล์เพราะฉันคิดว่าจะมีประโยชน์มากในสถานการณ์อื่น ๆ


เนื่องจากคุณกำลังใช้ awk คุณจะได้รับการยกเว้นการบันทึกส่วนหัว (สาย) โดยใช้เช่นNR awk 'NR>1 {print $1;}'ยังดีกว่า - ใช้งานpgrep -uหรือpkill -u
steeldriver

@steeldriver ที่น่าสนใจ! ทำคำตอบและอธิบายว่ามันทำงานอย่างไร ( awkคำสั่ง)
wefwefa3

คำตอบ:


14

หมายเหตุ: หากระบบของคุณมีอยู่แล้วpgrep/ pkillคุณจะทำการคิดค้นวงล้อใหม่ที่นี่ หากระบบของคุณไม่มียูทิลิตี้เหล่านี้คุณควรจัดรูปแบบผลลัพธ์ของpsการรับรายการ PID ที่ไม่มีภาระผูกพันโดยตรงเช่นps -u user -opid=

หากคุณใช้อยู่แล้วawkไม่จำเป็นต้องไพพ์ผ่านกระบวนการเพิ่มเติมเพื่อลบบรรทัดแรก (บันทึก): เพียงเพิ่มเงื่อนไขในหมายเลขบันทึกNR

ps -u user | awk 'NR>1{print $1;}'

เมื่อคุณพูดถึงheadและtailสูตรที่คุณอาจต้องการในกรณีนี้คือtail -n +2


4
tail -n +2เป็นสิ่งที่ฉันกำลังมองหา!
wefwefa3

+1 สำหรับบอกpsไม่ให้พิมพ์ส่วนหัวด้วย-opid=เนื่องจากจะป้องกันไม่ให้มีการแสดงผล หากผู้ใช้ในอนาคตตัดสินใจจัดเรียงpsเอาต์พุตในช่วงกลางของไพพ์ไลน์สมมติฐาน awk / sed / tail อาจแตก
Jeff Schaller

8

ในขณะที่ฉันกำลังเขียนคำถามนี้ฉันคิดวิธีแก้ปัญหาโดยใช้ sedขณะที่ผมกำลังเขียนคำถามนี้ฉันคิดว่าวิธีการแก้ปัญหาโดยใช้

ลบหนึ่งบรรทัดที่จุดเริ่มต้นของอินพุต

หากต้องการลบหนึ่งบรรทัดให้ใช้ sed 1dใช้ในการลบเส้นหนึ่ง

ลบหลายบรรทัดที่จุดเริ่มต้นของอินพุต

หากต้องการลบNจำนวนบรรทัดให้ใช้sed 1,Nd

  • ในการลบ 5 บรรทัดแรกให้ใช้ sed 1,5d

  • ในการลบ 10 บรรทัดแรกให้ใช้ sed 1,10d

  • ในการลบ 25 บรรทัดแรกให้ใช้ sed 1,25d

ไปป์ไลน์

ดังนั้นท่อส่งจะกลายเป็นในสถานการณ์กลายเป็น:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.