Schwanz und grep rekursiv?

1140
Josh Henry

Der Versuch, tailwenn eine Liste von Domains für einen Hacker - Code zu suchen. Alle Dateien, nach denen ich suche, sind die gleichen, also habe ich so etwas ausprobiert:

grep -rnl * -e "Ai9LbaFz7lC13SwzDxAYT72vwA" 

Versucht auch den Dateinamen / das Verzeichnis zu sehen.

Das durchsucht jedoch die gesamte Datei und das kann eine Verschwendung von CPU und Zeit sein, also versuche tailich, sie mit zu schreiben, da ich nur einen kleinen Abschnitt der Datei durchsuchen muss. Das hat funktioniert:

tail -n10 * | grep --line-buffered -e '^==> .* <==$' -e 'Ai9LbaFz7lC13SwzDxAYT72vwA' 

Es tailscheint jedoch nicht rekursiv zu sein, also bleibt es nur in seinem Verzeichnis. Ich bin definitiv kein Code-Master, also hoffe ich, dass mich jemand in die richtige Richtung weisen kann.

Vielen Dank.

1

2 Antworten auf die Frage

2
dannysauer

Der Befehl tail muss die gesamte Datei lesen, um die letzten zehn Zeilen zu berechnen. Es ermittelt Zeilen durch Suche nach Zeilenumbrüchen. Also liest man die Datei nach festen Zeichenketten.

Ihr grep liest dagegen die gesamte Datei und sucht nach einer festen Zeichenfolge. Klingt nach ziemlich ähnlichem. Zugegeben, der grep ist ein bisschen komplexer, aber ich wette, der Aufwand, einen neuen Prozess zu formen und die Pipes einzurichten, ist mehr als der grep-Aufwand. Sie können den Grep-Befehl jedoch etwas beschleunigen, indem Sie ihm mitteilen, dass Ihr Muster eine feste Zeichenfolge ist und nicht ein regulärer Ausdruck. Geben Sie dazu die Option "-F" für grep an (oder verwenden Sie fgrep). Wenn Sie GNU grep haben, können Sie wahrscheinlich auch --mmap verwenden, um die Dinge zu beschleunigen.

Probieren Sie grep -rnl * --mmap -F -e "Ai9LbaFz7lC13SwzDxAYT72vwA"es aus und sehen Sie, ob es vielleicht genauso schnell oder schneller ist als Ihre Lösung mit Tail. :)

Die Genauigkeit des nur grep-only-Scans ist jedoch eine andere Frage, da dies immer noch nicht bestätigt, dass die Übereinstimmung in den letzten 10 Zeilen der Datei liegt. Ich hoffe jedoch, diesen Teil zu beschönigen, indem ich die Verwendung eines Nachverarbeitungsbefehls zum Zählen der Zeilen in übereinstimmenden Dateien oder so vorschlage. ;)

1
glenn jackman

bash:

shopt -s globstar nullglob  for f in **; do if [[ -f $f ]] && tail -n 10 "$f" | grep -q --options 'pattern'; then echo "$f" fi done