ฉันจะดึงเฉพาะตัวเลขใน grep ได้อย่างไร


56

ฉันมีไฟล์เช่นนี้:

 other lines . . .    
 blah blah blah (:34)

ฉันต้องการค้นหาตัวเลขในไฟล์ด้านบน ฉันมากับ:

grep [0-9] filename

แต่นั่นเป็นการพิมพ์ทั้งหมด:

blah blah blah (:34)

34แต่ฉันต้องการเพียง มีวิธีการทำเช่นนั้น?


ในอนาคตตรวจสอบหน้า man สำหรับ grep (หรือโปรแกรมอื่น ๆ ) หน้ารายละเอียดตัวเลือกที่จำเป็นสำหรับการใช้งานทั่วไปของโปรแกรม เช่นman grep
hnasarat

คุณสามารถลองใช้งานได้> grep -o '[0-9] [0-9] *' testfile

คำตอบ:


74

คุณสามารถใช้grep -Eเพื่อเข้าถึงไวยากรณ์นิพจน์ปกติแบบขยาย (เช่นegrep )

ฉันสร้างไฟล์ทดสอบที่มีเนื้อหาด้านล่าง:

>cat testfile
this is some text
with some random lines

again some text
ok now going for numbers (:32)
ok now going for numbers (:12)
ok now going for numbers (:132)
ok now going for numbers (:1324)

ตอนนี้เพื่อ grep ตัวเลขเพียงอย่างเดียวจากข้อความที่คุณสามารถใช้

>grep -Eo '[0-9]{1,4}' testfile
32
12
132
1324

จะถูกส่งออก

ที่นี่"-o"ใช้เพื่อส่งออกเฉพาะส่วนที่จับคู่ของบรรทัดมากกว่าเนื้อหาทั้งหมดของบรรทัด

วงเล็บปีกกา (เช่น {และ}) ระบุจำนวนอินสแตนซ์ของการแข่งขัน {1,4} ต้องการให้อักขระหรือคลาสอักขระก่อนหน้าต้องเกิดขึ้นอย่างน้อยหนึ่งครั้ง แต่ไม่เกินสี่ครั้ง

หวังว่านี่จะช่วยได้


3
ดี นอกจากนี้เพื่อให้ตรงกับตัวเลขมากกว่า 4 หลักหรือตัวเลขโดยพลการใช้ grep -Eo '[0-9]{1,}' testfile
FractalSpace

8

คุณสามารถใช้นิพจน์วงเล็บเหลี่ยมที่[:digit:]ระบุตามมาตรา 9.3.5 ของมาตรฐาน POSIXร่วมกับการ-oตั้งค่าสถานะเพื่อพิมพ์เฉพาะ "คำ"

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123

5

grep -oจะพิมพ์เฉพาะส่วนที่ตรงกันของบรรทัด มิฉะนั้น grep จะพิมพ์บรรทัดใดก็ได้ด้วยลวดลาย


1

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

คำตอบที่ยอมรับไม่สนใจอาจมีตัวเลขในบรรทัดก่อนหน้าของไฟล์มันใช้งานได้กับข้อมูลตัวอย่าง แต่ถ้าไฟล์เป็นรีโมต

ในประเทศ

curl file:///home/$USER/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

ในตัวอย่างนี้output.txtในโฟลเดอร์ปัจจุบันของคุณจะถูกเขียนทับเรากำลังเข้าถึงinput.txtจากโฟลเดอร์สาธารณะของคุณ

ห่างไกล

curl https://yoursite.com/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

ในตัวอย่างนี้output.txtในโฟลเดอร์ปัจจุบันของคุณจะเขียนมากกว่าเรามีการเข้าถึงจากinput.txthttps://yoursite.com/Public/


1
ทำไมต้องใช้curlเมื่อง่าย ๆcatจะทำอย่างไร
PerlDuck

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