จะ grep ไฟล์ที่มีเฉพาะตัวเลขได้อย่างไร

ฉันกำลังพยายาม grep ชื่อไฟล์ txt ที่มีตัวเลขและตัวเลขเท่านั้น แต่ฉันไม่รู้ว่า grep เหมาะกับงานนั้นหรือไม่

ถ้าฉันมีไฟล์เหมือนด้านล่าง...

FILE1: 12324
FILE2: 12345q
FILE3: qqerxv

ควรให้เฉพาะชื่อ FILE1 แก่ฉันเท่านั้น

ฉันได้ลอง grep -r -l [a-zA-Z] แล้ว แต่นั่นทำให้ฉันตรงกันข้าม

ฉันควรใช้รูปแบบใด? ฉันควรทำอย่างไรเพื่อ grep ทุกอย่างยกเว้นไฟล์ที่มีทุกอย่างยกเว้นตัวเลข

ฉันจะ grep ไฟล์ที่มีเฉพาะตัวเลขได้อย่างไร


person ShamanWarrior    schedule 28.08.2019    source แหล่งที่มา


คำตอบ (3)


grep -r -L "[^0-9 ]" .

[^0-9 ] จะจับคู่อะไรก็ได้ที่ไม่มีตัวเลขหรือช่องว่าง (คิดว่าเหมาะสม ไม่เช่นนั้นไฟล์ทั้งหมดที่มีช่องว่างและตัวเลขจะถูกละทิ้ง)

แฟล็ก -L คือ --files-without-match ดังนั้นโดยพื้นฐานแล้วคุณจะได้ไฟล์ที่มีตัวเลขหรือช่องว่าง

การแปลงการค้นหาเป็นวิธีที่ดีกว่าการค้นหาไฟล์ที่มี [a-zA-Z] เนื่องจากการค้นหานี้อาจหยุดทำงานหากมีอักขระพิเศษอื่น ๆ (_=+&...) อยู่ในนั้น

อย่างไรก็ตาม แฟล็ก -r จะค้นหาซ้ำในไดเร็กทอรีปัจจุบัน หากคุณต้องการค้นหาเฉพาะไฟล์ในไดเร็กทอรีปัจจุบัน ฉันแนะนำให้ลบ -r และแทนที่ . ด้วย * หรือเพียงแค่แทนที่ด้วยชื่อของไฟล์เดียวที่คุณต้องการจับคู่

person Thomas Q    schedule 28.08.2019
comment
คลาสอักขระ [:digit:] น่าจะปลอดภัยกว่า 0-9 จากนั้นคุณอาจพิจารณาจัดการกับ read -r decimal_point thousands_sep < <(locale LC_NUMERIC) เพื่อรวมสิ่งเหล่านี้ไว้ในรูปแบบของคุณ - person Léa Gris; 29.08.2019
comment
ขอบคุณ นั่นคือสิ่งที่ฉันต้องการ ฉันซาบซึ้ง! - person ShamanWarrior; 29.08.2019

โปรดใช้รูปแบบ regex: \b([0-9])*\b

สิ่งนี้จะช่วยให้คุณ grep บรรทัดที่มีตัวเลขเท่านั้น

ตอนนี้เพื่อแยกชื่อของไฟล์จากเอาต์พุตด้านบน คุณสามารถ cut คำสั่ง โดย piping เอาต์พุตของ grep? tocut` เช่น

cat data.txt | grep \b([0-9])*\b | cut -f 1 -d ":"

ที่นี่ฉันถือว่าคุณได้เก็บรายชื่อไฟล์ของคุณไว้ในไฟล์ data.txt

ตัวเลือกที่ใช้ใน grep:

  • \b -- ขอบเขตคำ
  • [0-9] -- จับคู่เฉพาะตัวเลขเท่านั้น
  • () -- การจัดกลุ่ม

ตัวเลือกที่ใช้ใน cut:

  • f -- เพื่อเลือกฟิลด์
  • d -- เพื่อระบุตัวคั่น
person nocut    schedule 29.08.2019
comment
cat ไม่มีประโยชน์ และดึงข้อมูล ข้อความ ไม่ใช่ ชื่อไฟล์ จาก data.txt - person tripleee; 29.08.2019
comment
นอกจากนี้ อาร์กิวเมนต์ของ grep ไม่ใช่ตัวเลือก - person tripleee; 29.08.2019

awk เหล่านี้ควรทำ:

awk '!/[^0-9]/ {print FILENAME}' FILE*
awk '!/[a-zA-Z]/ {print FILENAME}' FILE*
FILE1

มันจะพิมพ์ Filenames ทั้งหมดจากไฟล์ที่มีเฉพาะตัวเลข

person Jotne    schedule 29.08.2019