Wie würden Sie jedes Vorkommen eines Begriffs in allen Dateien im aktuellen Verzeichnis zählen?

Wie würden Sie jedes Vorkommen eines Begriffs in allen Dateien im aktuellen Verzeichnis zählen?

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
  • -rin grep: sucht rekursiv in der aktuellen Verzeichnishierarchie;
  • -Fin grep: gleicht eine feste Zeichenfolge ab, statt einem Muster;
  • -oin grep: druckt nur Übereinstimmungen;
  • -lin wc: 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 -RFlag bedeutet, dass Sie das aktuelle Verzeichnis und alle seine Unterverzeichnisse rekursiv durchsuchen möchten. Das *ist ein Dateiselektor, der bedeutet: alle Dateien. Das -cFlag gibt grepnur 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 -cden Schalter von grep verwenden, um die Vorkommen zu zählen:

$ grep -rFoc foo
file1:3
dir/file2:3

verwandte Informationen