Wyklucz pliki, które mają bardzo długie linie tekstu z wyjścia grep

18

Często uruchamiam polecenia grep, aby znaleźć rzeczy w moim kodzie, ale problem z projektami internetowymi polega na tym, że często będą kompresowane pliki JavaScript i CSS, które tworzą jedną ogromną linię tekstu, więc jeśli zostanie znalezione dopasowanie, całe okno terminala jest wypełniony ponad 1000 linii, co sprawia, że ​​znalezienie tego, czego szukam, jest niezwykle niepraktyczne.

Czy istnieje sposób na uniknięcie plików zawierających pojedyncze wiersze tekstu o długości ponad 200 znaków?

Mark Cameron
źródło

Odpowiedzi:

20

Z GNU grep i xargs:

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

Alternatywnie możesz wyciąć wyjście grep:

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

lub powiedz terminalowi, aby nie zawijał tekstu, jeśli go obsługuje:

tput rmam
grep -r pattern .

albo użyj less -S

grep -r pattern . | less -S
Stéphane Chazelas
źródło
3
Używanie wyrażenia regularnego z pierwszego przykładu, pipowanie do grep z odwróconym dopasowaniem ... | grep -v -E '.{200}', również działa. Np. Aby znaleźć wszystkie wiersze plików * .js w bieżącym katalogu z „.name” w nich, które nie mają więcej niż 200 znaków: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver
3

Opcja 1: Możesz wykluczyć pliki pasujące do określonego wzorca:

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

Wykluczy to script.min.jsi style.min.css... Inne grepopcje obejmują --exclude-from=FILEi--exclude-dir=DIR

Opcja 2: Nie jestem pewien, czy to jest praktyczne, ale możesz zrobić cutpierwsze 200 znaków każdej linii, a następnie grep:

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

Pierwszy grepdokonuje wstępnego dopasowania i wypisuje nazwę pliku i linii, drugi zapewnia, że PATTERNnadal jest tam po cuttingowaniu linii.

aularon
źródło
2

W takiej sytuacji lubię wstawiać wzór w kontekście sąsiedztwa (powiedzmy 30 znaków):

grep -Po '.{0,30}pattern.{0,30}' *.js
JJoao
źródło