Поиск выходной строки и сохранение в переменной

Как найти слово в выводе сценария оболочки и сохранить в другой переменной.

Ниже команда будет отображать список базовых линий на мой взгляд.

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/@.*//"

(два регулярных выражения удаляют все до:и после@")

Другие вопросы по тегам