Wie würden Sie jedes Vorkommen eines Begriffs in allen Dateien im aktuellen Verzeichnis zählen? – und Unterverzeichnisse(?)
Ich habe gelesen, dass Sie hierfür verwenden müssten grep
. Wie lautet der genaue Befehl?
Ist das oben genannte auch mit einem anderen Befehl möglich?
Antwort1
Verwendung von grep
+ wc
(dadurch wird das mehrfache Vorkommen des Begriffs in derselben Zeile berücksichtigt):
grep -rFo foo | wc -l
-r
ingrep
: sucht rekursiv in der aktuellen Verzeichnishierarchie;-F
ingrep
: gleicht eine feste Zeichenfolge ab, statt einem Muster;-o
ingrep
: druckt nur Übereinstimmungen;-l
inwc
: druckt die Anzahl der Zeilen;
% 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
Antwort2
grep -Rc [term] *
wird das tun. Das -R
Flag bedeutet, dass Sie das aktuelle Verzeichnis und alle seine Unterverzeichnisse rekursiv durchsuchen möchten. Das *
ist ein Dateiselektor, der bedeutet: alle Dateien. Das -c
Flag gibt grep
nur die Anzahl der Vorkommen aus. Wenn das Wort jedoch mehrmals in einer Zeile vorkommt, wird es nur einmal gezählt.
Aus 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.
Wenn Sie keine symbolischen Links in Ihrem Verzeichnis haben, gibt es keinen Unterschied.
Antwort3
In einem kleinen Python-Skript:
#!/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)
Speichern Sie es als
count_string.py
.Starte esaus dem Verzeichnismit dem Befehl:
python3 /path/to/count_string.py <term>
Anmerkungen
- Wenn der Begriff Leerzeichen enthält, verwenden Sie Anführungszeichen.
- Dabei wird jedes Vorkommen des Begriffs rekursiv gezählt, auch bei mehrfachem Vorkommen in einer Zeile.
Erläuterung:
# 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)
Antwort4
Wenn Sie an einer Aufschlüsselung der Anzahl interessiert sind, können Sie als Variante der netten Antwort von @kos -c
den Schalter von grep verwenden, um die Vorkommen zu zählen:
$ grep -rFoc foo
file1:3
dir/file2:3