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?
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?
Antworten:
Sie können zwei Greps verwenden, die durch eine Pipe verbunden sind:
grep -r '.\{100\}' /path | grep 'if'
Um Dateien mit if
Pfaden oder Namen auszuschließen , verwenden Sie ':.*if'
stattdessen 'if'
(könnte immer noch unterbrochen werden, wenn Ihre Dateinamen oder Pfade Doppelpunkte enthalten).
if
in ihrem Pfad befinden
':.*if'
verhindern (es sei denn, Ihre Dateinamen enthalten Doppelpunkte).
Mit grep
s, die die Optionen ( -r
rekursiv) und -P
(PCRE) unterstützen (oder pcregrep
mit -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 grep
Implementierungen in nicht regulären Dateien suchen oder dies auch tun folgen Sie symbolischen Links).
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?
grep
von ast-open, das eine eigene Implementierung von Perl-ähnlichen regulären Ausdrücken hat. Zu den unterstützten Grep-Implementierungen grep -rP
gehören GNU, FreeBSD / OS / X (eine Neufassung von GNU-Grep, die jetzt divergiert) und Ast-Open's
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
awk
wäre eher so awk 'length > 100 && /if/' file
. Beachten Sie, dass Sie für /\<if\>/
GNU benötigen awk
.
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
sed -n '/.\{100\}/{/if/p}' file
. Ähnlich die Perl:perl -nle 'print if length$_>99 && /if/'
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 grep
s zu verwenden .
find . -type f -exec awk 'length > 100 && /if/' {} +