grep
имеет встроенную опцию -, я сам иногда ею пользуюсь.
Изman grep
:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate
output line.
Затем вы можете использовать tr
, чтобы избавиться от нежелательных символов:
$ tr -d '"'
Тестовая строка:
$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | grep -E -o '"(.*?)"' | tr -d '"'
Выход:
securityk9
Другой способ, если количество полей, разделенных пробелами -согласовано, может заключаться в использованииcut
(и tr
, так что по-прежнему 2 канала, и я уверен, что это можно сделать за один прогон):
$ cut -d ' ' -f 4 | tr -d '"'
Тест:
$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | cut -d ' ' -f 4 | tr -d '"'
securityk9
Использование perl
должно быть наиболее универсальным и переносимым среди всех систем Linux и Unix с установленным Perl 5.Направьте свой вывод на:
perl -p -e 's/.*?"(\w+)"/$1/g' -
Пример:
$ echo 'SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.1 = STRING: "ipbasek9"' | perl -p -e 's/.*?"(\w+)"/$1/g' -
ipbasek9
Пояснение:
-p iterate over each line of input
-e execute following code
s/foo/bar/g substitute 'foo' with 'bar' globally, in entire line
.*?" match any characters non-greedy, so up to first left-most double quote "
(\w+) match and capture into $1 any word-characters (alphanumeric, underscore _, plus connector punctuation chars)
$1 substitute with with whatever was captured in first parenthesis
Я добавил это в свой crontab, и все мои уведомления работают (в настоящее время тестируются с zenity и notify -send):
DISPLAY=":0.0"
XAUTHORITY="/home/me/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus