นี่คือง่ายสั้นและง่ายต่อการเขียนเข้าใจและตรวจสอบและฉันชอบมัน:
grep -oE '\S+$' file
grep
ใน Ubuntuเมื่อเรียกใช้-E
หรือ-P
ใช้ย่อ \s
เพื่อหมายถึงอักขระช่องว่าง (ในทางปฏิบัติมักจะมีช่องว่างหรือแท็บ) และ\S
หมายถึงสิ่งที่ไม่ใช่ ใช้ปริมาณ+
และยึดปลายของเส้น$
, รูปแบบ\S+$
ตรงกับหนึ่งหรือมากกว่าไม่ใช่ช่องว่างที่ท้ายบรรทัด คุณสามารถใช้-P
แทน-E
; ความหมายในกรณีนี้จะเหมือนกัน แต่แตกต่างกันเครื่องยนต์แสดงออกปกติจะใช้เพื่อให้พวกเขาอาจจะมีลักษณะการทำงานที่แตกต่างกัน
นี่เทียบเท่ากับวิธีแก้ปัญหาที่คอมเม้นต์ของ Avinash Raj (ด้วยไวยากรณ์ที่กระชับและง่ายกว่า):
grep -o '[^[:space:]]\+$' file
วิธีการเหล่านี้จะไม่ทำงานหากมีช่องว่างต่อท้ายหลังจำนวน พวกเขาสามารถปรับเปลี่ยนได้ดังนั้นพวกเขาก็ทำได้ แต่ฉันไม่เห็นจุดที่จะเข้าไปที่นี่ แม้ว่าบางครั้งก็ให้คำแนะนำที่จะพูดคุยแก้ปัญหาในการทำงานภายใต้กรณีอื่น ๆ ก็ไม่ได้ในทางปฏิบัติจะทำเช่นนั้นเกือบได้บ่อยเท่าที่คนมักจะคิดเพราะหนึ่งมักจะมีวิธีการที่จะรู้ว่าไม่มีซึ่งวิธีที่เข้ากันไม่ได้แตกต่างกันมากปัญหาอาจต้องในท้ายที่สุด ทั่วไป
ประสิทธิภาพเป็นบางครั้งการพิจารณาที่สำคัญ คำถามนี้ไม่ได้ระบุว่าอินพุตมีขนาดใหญ่มากและเป็นไปได้ว่าทุกวิธีที่โพสต์ที่นี่รวดเร็วพอ อย่างไรก็ตามในกรณีที่ต้องการความเร็วนี่เป็นเกณฑ์มาตรฐานขนาดเล็กในไฟล์อินพุตสิบล้านบรรทัด:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
ฉันวิ่งมันสองครั้งในกรณีที่คำสั่งสำคัญ (บางครั้งก็ทำเพื่องาน I / O หนัก) และเพราะฉันไม่มีเครื่องจักรที่ไม่ได้ทำสิ่งอื่นในพื้นหลังที่อาจบิดเบือนผลลัพธ์ จากผลลัพธ์เหล่านั้นฉันสรุปสิ่งต่อไปนี้อย่างน้อยเป็นการชั่วคราวและสำหรับไฟล์อินพุตที่ฉันใช้:
ว้าว! การส่งต่อ-P
(เพื่อใช้PCRE ) แทน-G
(ค่าเริ่มต้นเมื่อไม่ได้ระบุภาษา) หรือ-E
ทำได้grep
เร็วกว่าตามลำดับความสำคัญ ดังนั้นสำหรับไฟล์ขนาดใหญ่อาจใช้คำสั่งนี้ดีกว่าคำสั่งที่แสดงด้านบน:
grep -oP '\S+$' file
ว้าว!! cut
วิธีการในคำตอบของαғsнιη , เป็นมากกว่าลำดับความสำคัญได้เร็วกว่าแม้รุ่นเร็วขึ้นจากทางของฉัน! มันเป็นผู้ชนะในเกณฑ์มาตรฐานของ pa4080เช่นกันซึ่งครอบคลุมวิธีการมากกว่านี้ แต่มีการป้อนข้อมูลที่น้อยกว่า - และนี่คือเหตุผลที่ฉันเลือกวิธีอื่นรวมไว้ในการทดสอบของฉัน หากประสิทธิภาพมีความสำคัญหรือไฟล์มีขนาดใหญ่ฉันคิดว่าควรใช้วิธีของαғsнιηcut -d= -f2 file
cut
นอกจากนี้ยังทำหน้าที่เป็นเตือนว่าง่ายcut
และpaste
สาธารณูปโภคไม่ควรลืมและบางทีอาจจะควรจะแนะนำเมื่อบังคับแม้มีเครื่องมือที่มีความซับซ้อนมากขึ้นเช่นgrep
ที่มักจะมีการเสนอเป็นโซลูชั่นบรรทัดแรก (และที่ผมเองคุ้นเคยมากขึ้น ที่จะใช้)
grep -o '[^[:space:]]\+$' file