busybox - grep

astrapi

Mitglied
Mitglied seit
27 Mai 2005
Beiträge
341
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich benötige für meine Anpassung des WOL Scriptes die Option "w" von grep, leider ist diese bei der busybox von freetz nicht dabei.

laut Hersteller:
grep
grep [-HhrilLnqvsoweFEABC] PATTERN [FILEs...] Search for PATTERN in each FILE or standard input
Options:
-H Prefix output lines with filename where match was found
-h Suppress the prefixing filename on output
-r Recurse subdirectories
-i Ignore case distinctions
-l List names of files that match
-L List names of files that do not match
-n Print line number with output lines
-q Quiet. Return 0 if PATTERN is found, 1 otherwise
-v Select non-matching lines
-s Suppress file open/read error messages
-c Only print count of matching lines
-o Show only the part of a line that matches PATTERN
-m MAX Match up to MAX times per file
-w Match whole words only
-F PATTERN is a set of newline-separated strings
-E PATTERN is an extended regular expression
-e PTRN Pattern to match
-f FILE Read pattern from file
-A Print NUM lines of trailing context
-B Print NUM lines of leading context
-C Print NUM lines of output context
freetz:
grep --help
BusyBox v1.11.3 (2008-10-07 20:03:50 CEST) multi-call binary

Usage: grep [-HhrilLnqvsoeFEABC] PATTERN [FILEs...]

Search for PATTERN in each FILE or standard input

Options:
-H Prefix output lines with filename where match was found
-h Suppress the prefixing filename on output
-r Recurse subdirectories
-i Ignore case distinctions
-l List names of files that match
-L List names of files that do not match
-n Print line number with output lines
-q Quiet. Return 0 if PATTERN is found, 1 otherwise
-v Select non-matching lines
-s Suppress file open/read error messages
-c Only print count of matching lines
-o Show only the part of a line that matches PATTERN
-m MAX Match up to MAX times per file
-F PATTERN is a set of newline-separated strings
-E PATTERN is an extended regular expression
-e PTRN Pattern to match
-f FILE Read pattern from file
-A Print NUM lines of trailing context
-B Print NUM lines of leading context
-C Print NUM lines of output context
Jemand ne idee, wie man die Option "w" ersetzen kann, oder wie man sie in die freetz-version einbaut?
 
Die Quelltexte der Busybox sind jedem zugänglich.

Wenn sich der andere Teil der Frage auf eine alternative Lösung bezog, wäre es hilfreich, wenn Du genauer schreiben würdest, was Du machen willst.
 
Code:
make busybox-menuconfig

Dann müßtest Du an alle Optionen rankommen. Hab damit schon länger immer noch ein paar Kommandos mit reingenommen.

HTH
 
über "make busybox-menuconfig" kommt man nicht ran.

ich möchte den Inhalt der Variablen $host mit dem Inhalt der Datei der "wols" vergleichen, der Parameter -w hilft dabei nach ganzen Wörtern zu suchen


Inhalt von wols:
Code:
astrapi-pc08
astrapi-pc20
astrapi-vm
mein Code:
Code:
if ! grep -q -w "$host" /tmp/flash/wols; then
  continue
fi
 
Benötigst du in diesem Falle aber nicht zwangsläufig, oder?
 
leider schon, ansonsten wird z.B. localhost mit angezeigt. habe bisher noch keine andere lösung gefunden...
 
Ein simples "grep -v localhost" hilft dann auch ;)
 
Das Ganze geht sicher auch mit sed oder awk, wenn die Busybox kein optionales -w für grep hat.
 
und wie bau ich das in ... ein?
Code:
if ! grep -q -w "$host" /tmp/flash/wols; then
  continue
fi
 
Ich bin nicht ganz sicher, was überhaupt das Problem ist, aber mir ist noch was eingefallen:
Code:
grep -w "wort"
sollte ziemlich genau nachgebildet sein durch
Code:
egrep "(^|[[:space:]])wort([[:space:]]|$)"

Gruß, Nico
 
also, ein grep -q "$host" wols, liefert mir auch einträge aus der exhosts, bei denen kein hostname angegeben ist bzw wo der hostname an anderer stelle steh (localhost, fritz.box.nfs). "if [ -n "$host" ]; then" filtert mir die einträge leider auch nicht raus. die option w hat den erfolg gebracht.

ich such nach einer möglichkeit rauszufinden ob $host leer bzw null ist.
 
Ich versteh es gar nicht.
Ob die Variable $host leer ist, kannst Du mittels [ -z "$host" ] überprüfen. Das hat aber überhaupt nix mit grep o.ä. zu tun.
Was hast Du denn für einen Inhalt in der Variable $host, und was genau willst Du dann testen?
 
ich will aus der datei exhost nur die zeilen rausfiltern, die einen eintrag in der datei wols haben.

exhosts
Code:
127.0.0.1        localhost
192.168.178.2   fritz.box.nfs

192.168.111.99 * * rechner1
wols
Code:
rechner1
mit:
Code:
egrep -v '^(#|[[:space:]]*$)' exhosts |
  while read -r ip mac interface host desc; do
    if ! grep -q -w "$host" wols; then
      if [[ -n "$host" ]]; then
        continue
      fi
    fi
echo "$host|$mac|$ip"
done
bekomme ich auch localhost und fritz.box.nfs angezeigt
 
ich will aus der datei exhost nur die zeilen rausfiltern, die einen eintrag in der datei wols haben.
Wieso nutzt du denn dann nicht "grep -f"? Also (mit deinem Beispiel)
Code:
/var/tmp # grep -f wols exhosts
192.168.111.99 * * rechner1
/var/tmp #

Jörg
 
Ja, das grundlegende Mißverständnis hier ist die Funktionsweise von grep; grep sucht nach Zeilen, welche ein Muster beinhalten. Die Option -w führt lediglich dazu, daß das Muster nur dann gefunden wird, wenn es ein separates Wort innerhalb der Zeile ist; sie ändert nichts daran, daß wie immer bei grep die komplette Zeile, die die Fundstelle enthält, gefunden wird.
Die Lösung von MaxMuster ist natürlich die einfachste für Dein Problem.
 
grep -f liefert mir aber direkt die zeilen, ich möchte ja aber mit den zeilen weiterarbeiten ...
 
Du willst die Ausgabe haben, die die letzte Zeile Deines Scripts Dir dann entsprechend liefert? Dazu musst Du jetzt auf das Ergebnis das grep -f eine Transformation anwenden. Dazu ist awk gut geeignet:
Code:
grep -f wols exhosts | awk '{ printf "%s|%s|%s\n",$4,$2,$1 }'
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.