วิธีการเรียกใช้ grep ในคอลัมน์เดียว?


42

ฉันต้องการ grep ผลลัพธ์ของls -lคำสั่งของฉัน:

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

ฉันต้องการเรียกใช้grep rahmuในคอลัมน์ $ 3 เท่านั้นดังนั้นผลลัพธ์ของgrepคำสั่งของฉันควรมีลักษณะเช่นนี้:

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

วิธีที่ง่ายที่สุดที่จะทำคืออะไร? คำตอบต้องเป็นแบบพกพาใน Unices จำนวนมากโดยควรเน้นที่ Linux และ Solaris

หมายเหตุ: ฉันไม่ได้มองหาวิธีการค้นหาไฟล์ทั้งหมดที่เป็นของผู้ใช้ที่ได้รับ ตัวอย่างนี้ให้เพื่อทำให้คำถามของฉันชัดเจนยิ่งขึ้น


5
โปรดทราบว่าการแยกวิเคราะห์ผลลัพธ์ของlsมันค่อนข้างบอบบาง (คิดว่าจะเกิดอะไรขึ้นถ้าชื่อผู้ใช้มีช่องว่าง - และใช่เกิดขึ้นในบางแพลตฟอร์ม) ใช้findแทน
Gilles 'หยุดความชั่วร้าย'

นี้ไม่ตอบคำถามชื่อ แต่ผมจะพูดถึงว่า--printfตัวเลือกที่จะอาจจะมาในสะดวกในสถานที่ที่คุณมิฉะนั้นอาจพิจารณาแยกstat lsแต่โดยปกติแล้วfindคือสิ่งที่คุณต้องการ (ตามที่ @Gilles พูดถึง)
สัญลักษณ์แทน

คำตอบ:


49

อีกครั้งawkช่วยประหยัดวัน!

นี่เป็นวิธีที่ง่ายที่จะทำด้วยไวยากรณ์ที่ค่อนข้างง่าย:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

หรือง่ายยิ่งขึ้น: (ขอบคุณ Peter.O ในความคิดเห็น)

ls -l | awk '$3 == "rahmu"' 

9
หรือ: ls -l | awk '$3=="rahmu"'... และโดยวิธีการเปิด(วงเล็บควรจะเป็นหลังจากที่if...awk '{if($3 ...'
Peter.O

3
@ Peter.O +1 จากฉัน คำสั่งของคุณสั้นกระชับถูกต้องเนื่องจากการพิมพ์เป็นค่าเริ่มต้นสำหรับการจับคู่ awk
bsd

เพื่อหลีกเลี่ยงปัญหาการแปล (รูปแบบวันที่มีผลกระทบต่อลำดับคอลัมน์) ก็มักจะเป็นข้อเสนอแนะเพื่อให้แน่ใจว่ารูปแบบมาตรฐานและภาษา:LANG=C ls -l | awk ...
fheub

16

หากคุณกำลังมองเพื่อให้ตรงกับเพียงส่วนหนึ่งของสตริงในคอลัมน์ที่กำหนดคุณสามารถใช้คำแนะนำจากhttps://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches

some_command | awk '$6 ~ /string/'

1
นี่ควรเป็นคำตอบที่ดีที่สุด
PejoPhylo

11

ถ้าเป็นคอลัมน์คุณหมายถึงคอลัมน์ขนาดคงที่คุณสามารถ:

ls -l | grep "^.\{15\}rahmu"

โดยที่^หมายถึงจุดเริ่มต้นของบรรทัด.หมายถึงอักขระใด ๆ และ\{15\}หมายถึงการเกิดขึ้นของอักขระก่อนหน้าทั้งหมด 15 รายการ (อักขระใด ๆ ในกรณีนี้)


2

ฉันรู้ว่าฉันมางานปาร์ตี้ช้า แต่ฉันเชื่อว่าวิธีแก้ปัญหาโดยทั่วไปเกี่ยวกับปัญหานี้คือการใช้ awk ด้วยนิพจน์ทั่วไปดังนี้:

awk '$3~/rahmu/{print}' input_file

ส่วนที่ล้อมรอบด้วย '//' สามารถเป็นประเภทของการแสดงออกปกติใด ๆ


1

หากต้องการ grep ตามคอลัมน์ชื่อผู้ใช้เดียว (และพิมพ์เฉพาะไฟล์) คุณสามารถลอง:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

สำหรับไดเรกทอรีที่เปลี่ยน-ลงไปdสำหรับประเภทใด ๆ -ลบ

โดยทั่วไปจะเลือกแต่ละคอลัมน์\S\+\s\+ที่ตรงกับอักขระที่ไม่ใช่ช่องว่างตามด้วยอักขระเว้นวรรคดังนั้นเราจึงจับคู่คอลัมน์แรกสามคอลัมน์และชื่อผู้ใช้

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