Wie kann ich das Auftreten einer Zeichenfolge in einer Datei zählen?

77

Nehmen Sie einfach diesen Code als Beispiel. Wenn ich vorgeben möchte, dass es sich um eine HTML- / Textdatei handelt, wenn ich wissen möchte, wie oft insgesamt echoangezeigt wird, wie kann ich dies mit bash tun?

new_user()
{
    echo "Preparing to add a new user..."
    sleep 2
    adduser     # run the adduser program
}

echo "1. Add user"
echo "2. Exit"

echo "Enter your choice: "
read choice


case $choice in
    1) new_user     # call the new_user() function
       ;;
    *) exit
       ;;
esac 
Leo Chan
quelle

Antworten:

96

Dies gibt die Anzahl der Zeilen aus , die Ihre Suchzeichenfolge enthalten.

grep -c "echo" FILE

Dies zählt jedoch nicht die Anzahl der Vorkommen in der Datei (dh wenn Sie in einer Zeile mehrmals Echo haben).

bearbeiten:

Nachdem Sie ein bisschen herumgespielt haben, können Sie die Anzahl der Vorkommen mit diesem schmutzigen kleinen Code ermitteln:

sed 's/echo/echo\n/g' FILE | grep -c "echo"

Dies fügt im Grunde genommen nach jeder Echoinstanz eine neue Zeile hinzu, sodass jede Zeile in einer eigenen Zeile steht, sodass grep diese Zeilen zählen kann. Sie können den regulären Ausdruck verfeinern, wenn Sie nur das Wort "Echo" anstelle von "Echo" möchten.

Manny D.
quelle
Was kann ich also tun, wenn sich nur wenige Echos in derselben Zeile befinden? z.B. Echo Zeit Echo ein Echo
Leo Chan
Ich habe meine Antwort aktualisiert, die hoffentlich für Sie funktionieren sollte.
Manny D
Vielen Dank . Verbringen Sie noch ein paar Minuten, noch eine Frage. wenn ich das dritte Vorkommen von Echo löschen möchte. Was kann ich tun?
Leo Chan
@foodil: 3. Echo entfernen:sed -e 's/echo//3'
Prinz John Wesley
Kann ich die Anzahl der Vorkommen in einer Variablen wie dieser zuweisen?: NoOfTable1 = grep -c "table_1row" /var/www/html/INFOSEC/english/news/test.html danke
Leo Chan
156

Die Anzahl der Zeichenfolgenvorkommen (keine Zeilen ) kann grepmit den -oOptionen und wc(Wortanzahl) ermittelt werden:

$ echo "echo 1234 echo" | grep -o echo
echo
echo
$ echo "echo 1234 echo" | grep -o echo | wc -l
2

Die vollständige Lösung für Ihr Problem würde also folgendermaßen aussehen:

$ grep -o "echo" FILE | wc -l
Dmitry
quelle
1
Ich
denke
2
Seien Sie vorsichtig, wenn grep denkt, dass die Datei "binär" ist. Sie erhalten jedes Mal eine "1" -Ausgabe. -a
Fügen
1

Ich nehme hier einige Vermutungen an, weil ich nicht ganz verstehe, was Sie fragen.

Ich denke, was Sie wollen, ist die Anzahl der Zeilen, auf denen das Muster 'Echo' in der angegebenen Datei erscheint.

Ich habe Ihren Beispieltext in eine Datei namens eingefügt 6741967.

Zuerst grepfindet die Begegnungen:

james@Brindle:tmp$grep echo 6741967 
    echo "Preparing to add a new user..."
echo "1. Add user"
echo "2. Exit"
echo "Enter your choice: "

Zweitens verwenden Sie, um wc -ldie Zeilen zu zählen

james@Brindle:tmp$grep echo 6741967  | wc -l
       4
James Polley
quelle
danke für deine Hilfe . Tut mir leid, dass ich Sie verwirrt habe. Meine Frage ist, die Anzahl der Vorkommen in der Datei zu zählen
Leo Chan
2
Wenn Sie grep -o echo 6741967 ausführen, wird für jede Zeile eine neue Zeile ausgegeben. Dann können Sie Folgendes verwenden: grep -o echo 6741967 | wc -l und es werden auch mehrere 'Echos in einer einzigen Zeile berücksichtigt
Wivlaro
0

Keine der vorhandenen Antworten funktionierte für mich mit einer einzeiligen 10-GB-Datei. Grep hat selbst auf einem Computer mit 768 GB RAM nicht genügend Speicher!

$ cat /proc/meminfo | grep MemTotal
MemTotal:       791236260 kB
$ ls -lh test.json
-rw-r--r-- 1 me all 9.2G Nov 18 15:54 test.json
$ grep -o '0,0,0,0,0,0,0,0,' test.json  | wc -l
grep: memory exhausted
0

Also habe ich ein sehr einfaches Rust-Programm geschrieben, um es zu tun .

  1. Installieren Sie Rust .
  2. cargo install count_occurences
$ count_occurences '0,0,0,0,0,0,0,0,' test.json
99094198

Es ist etwas langsam (1 Minute für 10 GB), aber es geht nicht der Speicher aus!

Timmmm
quelle
-1

Wenn Sie nur die Anzahl der Vorkommen angeben möchten, können Sie dies tun: $ grep -c "string_to_count" Dateiname

Anfänger
quelle
2
Die Zeichenfolge, die zweimal in derselben Zeile vorkommt, wird nicht korrekt gezählt.
Josiah