Schließen Sie Dateien mit sehr langen Textzeilen von der Grep-Ausgabe aus

18

Ich führe häufig grep-Befehle aus, um Dinge in meinem Code zu finden, aber das Problem bei Webprojekten ist, dass es häufig komprimierte JavaScript- und CSS-Dateien gibt, die eine große Textzeile erzeugen. Wenn also eine Übereinstimmung gefunden wird, wird das gesamte Terminalfenster angezeigt mehr als 1000 Zeilen gefüllt, was es äußerst unpraktisch macht, das zu finden, wonach ich suche.

Gibt es eine Möglichkeit, Dateien zu vermeiden, die einzelne Textzeilen mit mehr als 200 Zeichen enthalten?

Mark Cameron
quelle

Antworten:

20

Mit GNU grep und xargs:

grep -rLZE '.{200}' . | xargs -r0 grep pattern

Alternativ können Sie die Ausgabe von grep abschneiden:

grep -r pattern . | cut -c1-"$COLUMNS"

oder weisen Sie Ihr Terminal an, keinen Text umzubrechen, wenn dies unterstützt wird:

tput rmam
grep -r pattern .

oder verwenden less -S

grep -r pattern . | less -S
Stéphane Chazelas
quelle
3
Die Verwendung von Regex aus Ihrem ersten Beispiel, Piping in grep mit invert match ... | grep -v -E '.{200}', funktioniert ebenfalls. ZB, um alle Zeilen von * .js-Dateien unter dem aktuellen Verzeichnis mit ".name" zu finden, die nicht länger als 200 Zeichen sind: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver
3

Option 1: Sie können Dateien ausschließen, die einem bestimmten Muster entsprechen:

grep --exclude='*.min.*'

Dies wird ausschließen script.min.jsund style.min.css... Andere grepOption enthalten --exclude-from=FILEund--exclude-dir=DIR

Option 2: Ich bin nicht sicher, ob dies praktisch ist, aber Sie können cutdie ersten 200 Zeichen jeder Zeile und dann grepdiese:

grep -H [OPTIONS] PATTERN [FILE...] | cut -c1-200 | grep PATTERN

Der erste grepführt eine anfängliche Übereinstimmung durch und gibt den Dateinamen und die Zeile aus, der zweite stellt sicher, dass die Datei PATTERNnach dem cutEinfügen der Zeilen noch vorhanden ist.

aularon
quelle
2

In dieser Situation greife ich gerne ein Muster mit einem Nachbarschaftskontext (sagen wir 30 Zeichen):

grep -Po '.{0,30}pattern.{0,30}' *.js
Joao
quelle