Wenn Sie ein System mit GNU-Erweiterungen (aber nicht sicher sind, es mit optionaler PCRE-Unterstützung kompiliert wurde), betrachten:
if result=$(grep -E -m 1 -o 'this is:[^[:space:]]+' logfile); then
echo "value is: ${result#*:}"
fi
${varname#value}
auf den Inhalt varname
erweitert, sondern mit value
aus dem gestrippt Anfang wenn vorhanden. Somit streift ${result#*:}
alles bis zum ersten Doppelpunkt in result
.
Dies funktioniert jedoch möglicherweise nicht auf Systemen ohne die Nicht-POSIX-Optionen -o
oder -m
.
Wenn Sie nicht-GNU-Systeme zu unterstützen, ist awk
ein Werkzeug einer Überlegung wert: Im Gegensatz zu Antworten erfordern nonportable Erweiterungen (wie grep -P
), das auf jeder moderne Plattform awk (getestet mit GNU awk, die letzten BSD arbeiten sollte und mawk, auch keine Warnungen mit mit gawk --posix --lint
):
# note that the constant 8 is the length of "this is:"
# GNU awk has cleaner syntax, but trying to be portable here.
if value=$(awk '
BEGIN { matched=0; } # by default, this will trigger END to exit as failure
/this is:/ {
match($0, /this\ is:([^[:space:]]+)/);
print substr($0, RSTART+8, RLENGTH-8);
matched=1; # tell END block to use zero exit status
exit(0); # stop processing remaining file contents, jump to END
}
END { if(matched == 0) { exit(1); } }
'); then
echo "Found value of $value"
else
echo "Could not find $value in file"
fi
Wie lange einer Datei? Wenn es kurz ist, kann es schneller sein, diese Suche in der nativen Shell zu machen, anstatt externe Tools zu erzeugen ('grep',' sed', 'awk', usw.), obwohl diese Werkzeuge den Inhalt im Allgemeinen schneller verarbeiten als die Kosten, um sie zu starten up ist bezahlt. –
BTW, das äußere 'if grep -q' ist wohl eine schlechte Idee - bedeutet, dass Sie die Datei zweimal lesen, einmal, um ihren Inhalt zu überprüfen, und dann wieder, um ihren Inhalt zu lesen. Wenn Sie einen externen Befehl ausführen, verwenden Sie besser if result = $ (that-command); dann ... 'um sowohl die Ausgabe zu erfassen als auch den Exit-Status in einem Durchgang zu prüfen. Wenn der Befehl den Exit-Status nicht basierend darauf festlegt, ob es eine Übereinstimmung gibt, dann ist 'if result = $ (that-Befehl) && [-n" $ result "]; dann kann es mehr Sinn ergeben. –