Поиск выходной строки и сохранение в переменной
Как найти слово в выводе сценария оболочки и сохранить в другой переменной.
Ниже команда будет отображать список базовых линий на мой взгляд.
cmd :cleartool lsstream -fmt "%[found_bls]NXp\n" -view $VIEW_NAME
Выход:
baseline:MHC_BUILDTREE1.0.1
baseline:JEPG_DUIF_CI
baseline:MOR_BuildTree_BLD_I.0.1
Мне нужно найти строку, которая содержит "MOR_BuildTree"
и эту выходную строку я должен сохранить в одной переменной, чтобы выполнить остальные команды. Кто-нибудь может дать предложение?
3 ответа
Не совсем точно, что вы спрашиваете, но чтобы установить переменную для результата команды, вы можете использовать:
var=`command`
или вы можете направить свою команду в какой-то фильтр, чтобы переформатировать его по мере необходимости.
command | some_filter | another filter
Вы также можете объединить два:
var=`command | some_filter | another filter`
Разве это не простой кусок сценария оболочки?
variable=$(cmd :cleartool lsstream -fmt "%[found_bls]NXp\n" -view $VIEW_NAME |
sed -n '/MOR_Buildtree/s/^baseline://p')
-n
options означает "не печатать по умолчанию". Команда ищет ваше имя, удаляет ведущие baseline:
и печатает это.
Вот что я только что проверил, чтобы получить один базовый уровень из всех базовых базовых показателей:
$ res=`cleartool lsstream -fmt "%[found_bls]CXp" -view $VIEW_NAME | tr -s " " "\\012" | grep $yourBaselineName| sed -e "s/.*://" -e "s/@.*//"`
(задавать $yourBaselineName
на соответствующее имя, которое вы хотите извлечь)
Основная трудность связана с тем, что lsstream -fmt "%[found_bls]CXp"
будет перечислять все базовые базовые линии в одной и той же строке вывода (поэтому выходные данные представляют собой только одну строку базовых имен, разделенных запятой).
Сначала нужно разбить строку на несколько.
Смотрите раздел " Как разбить одну строку на несколько строк в оболочке bash?": tr -s " " "\\012"
часть вышеуказанной команды.
Затем вам нужно удалить то, что предшествует, и следовать базовому имени:
baseline:aBaselineName@/vobs/YourPVob
sed
часть вышеупомянутой команды может сделать это:
sed -e "s/.*://" -e "s/@.*//"
(два регулярных выражения удаляют все до:
и после@
")