grep oder sed, um einen ganzzahligen Wert über einem bestimmten Betrag zu finden?

7

Dies bezieht sich auf eine andere Frage: Wie verwende ich Robocopy, um alle Dateien über eine bestimmte Größe rekursiv aufzulisten?

Ich möchte die Ausgabe eines Befehls analysieren (oder eine Protokolldatei katzen) und einen Zeichenfolgenwert suchen, ihn in eine Ganzzahl konvertieren und dann prüfen, ob dieser Ganzzahlwert größer als eine bestimmte Ganzzahl ist.

Zum Beispiel angesichts der Zeile:

      *EXTRA File          78223    C:\_Google.Enterprise.Contract.2010-06-01.pdf

Ich möchte '78223' mit '10485760' vergleichen. Ist das mit grep oder sed möglich?

Vielen Dank!

mbrownnyc
quelle
2
Sie sind wahrscheinlich awk oder eine Skriptsprache für numerische Vergleiche.
Zoredache
1
Das sollte in den UNIX-Stackexchange verschoben worden sein.
Jim B
@ JimB: Möglicherweise, aber Fragen, die älter als 60 Tage sind, können nicht migriert werden.
HBruijn
Es ist eine Windows-Frage ... schauen Sie einfach auf den Pfad.
mbrownnyc

Antworten:

14

Verwenden Sie awkwie folgt:

$ echo '*EXTRA File     78223    C:\foo.pdf' | awk '$3 > 1048576 {print $0;}'
$ echo '*EXTRA File     78223    C:\foo.pdf' | awk '$3 > 40000 {print $0;}'
*EXTRA File     78223    C:\foo.pdf
MikeyB
quelle
Vielen Dank. Nicht vertraut mit awk. Es scheint sehr praktisch zu sein.
mbrownnyc
4

Wenn Sie ein Unix-ähnliches Benutzerland verwenden (wie UnxUtils oder Cygwin, wenn Sie unter Windows arbeiten), können Sie findmit dem -sizeParameter Ihre Dateiliste direkt abrufen und dann zu xargs weiterleiten und alles tun, was Sie sind versuchen, mit den ausgewählten Dateien zu tun.

Die allgemeine Antwort auf Ihre Frage (interessante Vergleiche und andere Operationen) lautet zwar awk oder bash (mit bc) oder perl - aber das spezifische Szenario bietet sich an find.

mfinni
quelle
Bash kann nativ ganzzahlige Mathematik durchführen, siehe mywiki.wooledge.org/ArithmeticExpression
astrostl
find kann auch -exec anstatt zu xargs zu leiten. Wenn der xargs-ähnliche Stil "Alle Argumente in einem Befehl" bevorzugt wird, beenden Sie mit + anstatt mit; Überprüfen Sie heraus mywiki.wooledge.org/… :)
astrostl
2

In reinem Bash:

while read -r _ _ size _; do ((size > 10485760)) && echo "hit"; done < foo.log
astrostl
quelle
Dies kann leicht geändert werden, um alle Felder oder die gesamte Zeile zu melden, wenn eine Übereinstimmung vorliegt, und / oder die Vergleichszahl zur Laufzeit benutzerdefiniert zu definieren. Wenn Sie das wollen, nur LMK.
Astrostl
0

Perl kann ähnlich wie awk verwendet werden:

echo '*EXTRA File 78223 C:\foo.pdf' | perl -ane 'print if $F[2] > 40000'

Chris Koknat
quelle