Geçerli dizindeki tüm dosyalarda bir terimin her oluşumunu nasıl sayacaksınız? - ve alt dizinler (?)
Bunu yapmak için bunu okudum grep
; tam komut nedir?
Ayrıca, başka bir komutla yukarıdakiler mümkün müdür?
Geçerli dizindeki tüm dosyalarda bir terimin her oluşumunu nasıl sayacaksınız? - ve alt dizinler (?)
Bunu yapmak için bunu okudum grep
; tam komut nedir?
Ayrıca, başka bir komutla yukarıdakiler mümkün müdür?
Yanıtlar:
Kullanımı grep
+ wc
(aynı satırda terimin birden bulunuşu için bu irade hitap):
grep -rFo foo | wc -l
-r
in grep
: geçerli dizin hiyerarşisinde özyinelemeli olarak arama yapar;-F
in grep
: desen yerine sabit bir dizeyle eşleşir;-o
in grep
: yalnızca eşleşmeleri yazdırır;-l
in wc
: satır sayısını yazdırır;% 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
Deneysel oldukları için kullanılmaması gerektiğini düşünüyorum
-F
muhtemelen daha hızlı olurdu.
-F
yerine kullanmayı denemedim -P
. -F
Gerçekten burada daha iyi uyuyor kullanarak güncelleme büyük öneri için teşekkürler .
grep -Rc [term] *
bunu yapacak. -R
Bayrak özyinelemeli geçerli dizin ve onun alt dizinleri tüm arama yapmak istediğiniz anlamına gelir. *
Tüm dosyaları: Bir dosya seçici anlamıdır. -c
Bayrak yapan grep
çıktılı olaylar sadece dizi. Ancak, sözcük tek bir satırda birden çok kez oluşursa, yalnızca bir kez sayılır.
Gönderen 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.
Dizininizde hiçbir sembolik bağ yoksa, hiçbir fark yoktur.
-c
bayrağını ekleyebilirsiniz grep
. Sonra grep kendini sayar ve ihtiyacınız yokwc
--
önce koymak isteyebilirsiniz*
*
Tüm bu kaçırma böylece sadece, sigara dotfiles genişleyecektir. Sadece "." Kullanmak daha mantıklı. çünkü argümanları yinelemeli olarak tekrar işleyeceksiniz - ve bu nokta dosyaları alacak. Buradaki en büyük sorun, bunun bir kelimenin meydana gelme sayısını değil satır sayısını alabileceğidir. Terim bir satırda birden çok kez görünüyorsa, "grep -c" ile yalnızca bir kez sayılır
Küçük bir python betiğinde:
#!/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
.Koştur dizinden komutuyla:
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
ve ne f
için?
root
geçerli dizinin "yukarısını" içeren dosyanın yolu f
, dosyadır. Alternatif olarak, os.path.join()
kullanılabilir, ancak daha ayrıntılıdır.
n = n + open(f).read().count(s)
?