คุณจะนับคำที่เกิดขึ้นในไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันได้อย่างไร - และไดเรกทอรีย่อย (?)
ฉันได้อ่านสิ่งนี้แล้วคุณจะใช้grep
; คำสั่งที่แน่นอนคืออะไร?
นอกจากนี้ยังสามารถใช้คำสั่งข้างต้นได้หรือไม่
คุณจะนับคำที่เกิดขึ้นในไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันได้อย่างไร - และไดเรกทอรีย่อย (?)
ฉันได้อ่านสิ่งนี้แล้วคุณจะใช้grep
; คำสั่งที่แน่นอนคืออะไร?
นอกจากนี้ยังสามารถใช้คำสั่งข้างต้นได้หรือไม่
คำตอบ:
การใช้grep
+ wc
(สิ่งนี้จะรองรับการเกิดขึ้นหลายคำในบรรทัดเดียวกัน):
grep -rFo foo | wc -l
-r
ในgrep
: ค้นหาแบบวนซ้ำในลำดับชั้นไดเรกทอรีปัจจุบัน-F
ในgrep
: จับคู่กับสตริงคงที่แทนกับรูปแบบ;-o
ในgrep
: พิมพ์เฉพาะการจับคู่;-l
ในwc
: พิมพ์จำนวนบรรทัด;% tree
.
├── dir
│ └── file2
└── file1
1 directory, 2 files
% cat file1
line1 foo foo
line2 foo
line3 foo
% cat dir/file2
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8
PCREs
ไม่ควรใช้เนื่องจากเป็นรุ่นทดลอง
-F
อาจจะเร็วกว่า
-F
-P
ขอบคุณสำหรับคำแนะนำที่ดีการอัปเดตโดยใช้-F
ซึ่งเหมาะกับที่นี่จริง ๆ
grep -Rc [term] *
จะทำเช่นนั้น การ-R
ตั้งค่าสถานะหมายความว่าคุณต้องการค้นหาไดเรกทอรีปัจจุบันซ้ำและไดเรกทอรีย่อยทั้งหมด *
ความหมายตัวเลือกไฟล์: ไฟล์ทั้งหมด -c
ธงจะทำให้grep
การส่งออกเพียง แต่จำนวนของการเกิดขึ้น อย่างไรก็ตามหากคำนั้นเกิดขึ้นหลายครั้งในบรรทัดเดียวคำนั้นจะถูกนับเพียงครั้งเดียว
จากman grep
:
-r, --recursive
Read all files under each directory, recursively, following symbolic links only if they are on the command line.
This is equivalent to the -d recurse option.
-R, --dereference-recursive
Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
หากคุณไม่มีลิงก์สัญลักษณ์ในไดเรกทอรีของคุณไม่มีความแตกต่าง
-c
grep
จากนั้น grep นับตัวเองและคุณไม่จำเป็นต้องใช้wc
--
ก่อน*
*
จะขยายตัวออกไปไม่ใช่ dotfiles ดังนั้นคุณจึงพลาดเหล่านั้นทั้งหมด มันสมเหตุสมผลมากกว่าที่จะเพียงแค่ใช้ "" เนื่องจากคุณจะดำเนินการกับข้อโต้แย้งแบบวนซ้ำ - และนั่นจะเป็นจุดไฟล์ ปัญหาที่ใหญ่กว่าที่นี่คือสิ่งนี้จะทำให้จำนวนบรรทัดไม่ใช่จำนวนครั้งของคำ หากคำนั้นปรากฏหลายครั้งในหนึ่งบรรทัดคำสั่งนั้นจะถูกนับเพียงครั้งเดียวโดย "grep -c"
ในสคริปต์หลามขนาดเล็ก:
#!/usr/bin/env python3
import os
import sys
s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
for f in files:
f = root+"/"+f
try:
n = n + open(f).read().count(s)
except:
pass
print(n)
count_string.py
บันทึกเป็นรันจากไดเร็กทอรีด้วยคำสั่ง:
python3 /path/to/count_string.py <term>
# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
for f in files:
# join the path(s) above the file and the file itself
f = root+"/"+f
# try to read the file (will fail if the file is unreadable for some reason)
try:
# add the number of found occurrences of <term> in the file
n = n + open(f).read().count(s)
except:
pass
print(n)
root
และf
หา?
root
เป็นเส้นทางไปยังไฟล์รวมถึง "ด้านบน" ไดเรกทอรีปัจจุบันf
เป็นไฟล์ อีกวิธีหนึ่งคือ os.path.join()
สามารถใช้ แต่ verbose มากขึ้น
n = n + open(f).read().count(s)
?
เป็นตัวแปรของคำตอบที่ดีของ @ kos หากคุณสนใจในการนับจำนวนการนับคุณสามารถใช้-c
สวิตช์ของ grep เพื่อนับเหตุการณ์ที่เกิดขึ้น:
$ grep -rFoc foo
file1:3
dir/file2:3