Wie finde ich Zeilen mit mehr als 100 Zeichen und einem "Wenn"?

8

Also, wahrscheinlich sollte ich das verwenden grep. Solange ich eine rekursive Suche benötige, sollte ich verwenden grep -r. Aber dann weiß ich nicht, was ich als nächstes tun soll;)

Wie kann ich das machen?

pushandpop
quelle
4
find . -type f -exec awk 'length > 100 && /if/' {} +
Stéphane Chazelas
Ich zucke bei dem Gedanken zusammen, jemals eine Codebasis nach Zeilen mit einer if-Anweisung mit mehr als 100 Zeichen durchsuchen zu müssen, um sie umzugestalten: -Z
Falco
@ Falco Die Aussage selbst könnte einfach sein, nur ein bisschen eingerückt.
Kaz

Antworten:

8

Sie können zwei Greps verwenden, die durch eine Pipe verbunden sind:

grep -r '.\{100\}' /path | grep 'if'

Um Dateien mit ifPfaden oder Namen auszuschließen , verwenden Sie ':.*if'stattdessen 'if'(könnte immer noch unterbrochen werden, wenn Ihre Dateinamen oder Pfade Doppelpunkte enthalten).

Choroba
quelle
4
Beachten Sie, dass es alle 100 Zeichenzeilen in Dateien melden könnte, die sich ifin ihrem Pfad befinden
Stéphane Chazelas
@ StéphaneChazelas: Stimmt. Sie können dies ':.*if'verhindern (es sei denn, Ihre Dateinamen enthalten Doppelpunkte).
Choroba
13

Mit greps, die die Optionen ( -rrekursiv) und -P(PCRE) unterstützen (oder pcregrepmit -r):

grep -rP '^(?=.{101}).*?if' .

Oder POSIXly:

find . -type f -exec awk 'length > 100 && /if/ {
   print FILENAME ": " $0}' {} +

(Beachten Sie, dass das Verhalten zwischen den Implementierungen für Nicht-Text-Dateien variiert (Dateien, die keine Zeichen, Null-Byte-Werte, zu lange Zeilen oder Daten nach der letzten neuen Zeile enthalten). Beachten Sie auch, dass einige grepImplementierungen in nicht regulären Dateien suchen oder dies auch tun folgen Sie symbolischen Links).

Stéphane Chazelas
quelle
Mir ist nur einer bekannt grep, der dies tut, und selbst dieser benötigt seine in die Bibliothek integrierte Unterstützung, um so zu funktionieren, wie ich es verstehe. Sind da mehr?
Mikeserv
1
@mikeserv, nicht sicher, was du mit lib c meinst . Die Unterstützung von PCRE-Regexp wird im Allgemeinen von libpcre bereitgestellt. Eine Ausnahme bildet das grepvon ast-open, das eine eigene Implementierung von Perl-ähnlichen regulären Ausdrücken hat. Zu den unterstützten Grep-Implementierungen grep -rPgehören GNU, FreeBSD / OS / X (eine Neufassung von GNU-Grep, die jetzt divergiert) und Ast-Open's
Stéphane Chazelas,
12

Verwenden Sie awk, um die Größe von $ 0 und das Vorhandensein von Teilzeichenfolgen zu zählen, wenn?
awk '( length($0) > 100 && index($0,"if") ){print}' file

Wenn "if" ein Wort sein sollte (im Gegensatz zu einem einfachen Teilstring), können Sie verwenden awk '( length($0) > 100 && match($0,/\<if\>/) ){print}' file

Dani_l
quelle
6
Die idiomatische Art, es einzuschreiben, awkwäre eher so awk 'length > 100 && /if/' file. Beachten Sie, dass Sie für /\<if\>/GNU benötigen awk.
Stéphane Chazelas
@ StéphaneChazelas Ja, ich habe deine Syntax gesehen und den richtigen Weg gelernt, aber da du bereits eine Antwort gepostet hast, habe ich keinen Sinn darin gesehen, meine zu ändern. Ich habe Ihre Antwort jedoch positiv bewertet.
Dani_l
4

Angepasst an Suchen von Zeilen, die eine bestimmte Länge überschreiten, funktioniert eine der folgenden Optionen, um Zeilen zu finden, die länger als 100 Zeichen sind

grep '.\{100\}' file

perl -nle 'print if length$_>99' file

awk 'length($0)>99' file

sed -n '/.\{100\}/p' file

Wählen Sie Ihre bevorzugte Methode und leiten Sie sie durch grep if

David King
quelle
2
Die sed-Version kann beide Überprüfungen gleichzeitig durchführen. Beispiel mit GNU-Erweiterungen : sed -n '/.\{100\}/{/if/p}' file. Ähnlich die Perl:perl -nle 'print if length$_>99 && /if/'
Toby Speight
3

mit einem einzigen grep:

grep -vxE '.{0,99}|([^i]|i[^f])*i*' <in >out

Dadurch werden nur Zeilen ausgewählt, die mit beiden Anweisungen nicht von Kopf bis Schwanz beschrieben werden können. und so wird keine Zeile ausgewählt, die als aus 0 bis 99 Zeichen bestehend beschrieben werden kann, und in ähnlicher Weise wird auch keine Zeile ausgewählt, die mehr als 99 Zeichen entspricht und dennoch nicht mindestens eine einzige enthält, wenn sie ebenfalls nicht ausgewählt wird.

printf '^%-100b$\n' 'if\nif' 'hey if' i if |
grep -nvxE '.{0,99}|([^i]|i[^f])*i*'

3:^hey if                                                                                              $
5:^if                                                                                                  $

Sie könnten es jedoch besser machen, nur zwei greps zu verwenden .

mikeserv
quelle