Верните одно значение и сохраните его в переменной

Верните одно значение и сохраните его в переменной

У меня есть предложение, которое возвращает два значения.

cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/'

Return
1521
1522

С помощью этого предложения я хочу получить только одно значение. Это значение я хочу сохранить в переменной для построения строки sqlplus для автоматического подключения к базе данных Oracle и последующего выполнения команды.

Как ограничить количество возвращаемых результатов и сохранить их в переменной, чтобы позже использовать это значение в другой команде?

Обновлять:

Я добавил предложение в вызов ssh, но когда я его выполняю, я не получаю никакого значения (без вызова ssh все работает нормально с head -1)

read -p "Maquina : " maquina; read -p "SID : " sid; ssh ora$sid@`echo $maquina` "port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/ ' | head -1)| echo $port"

решение1

Учитывая то, как вы построили команду, по рекомендации было бы использовать head, tailили некоторую комбинацию из двух, чтобы получить только один результат. Если вам нужен только первый результат, head -1следует это сделать. Если вы ищете конкретный номер строки, комбинация headи, tailвероятно, будет необходима.

решение2

Если вам нужно первое возвращаемое значение, вы можете использовать |head -1для его получения.

Затем вы можете использовать $()структуру, чтобы вернуть ее как значение, например:

port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/' | head -1)

решение3

Это множество команд, выполняющих те же действия, которые может выполнить только одна команда.

Я не знаю, как отформатирован «listener.ora», но приведенная ниже строка должна работать нормально, максимум с небольшими изменениями.

sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora

-rдля регулярного выражения
-nдля подавления автоматической печати,
/PORT/чтобы найти строку, содержащую PORT,
s/для замены
/p, чтобы напечатать отредактированные строки

Используйте функцию «голова» или «хвост», чтобы получить одно или другое значение.

$PORT0=(sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora | head -1)

Или, если вы хотите и то, и другое:

grab_port () { sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora ; }
$PORT0=$(grab_port|head -1)
$PORT1=$(grab_port|tail -1)

Теперь давайте посмотрим на вашу строку:

read -p "Maquina : " maquina; read -p "SID : " sid; ssh ora$sid@`echo $maquina` "port=$(cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/ ' | head -1)| echo $port"

Часть, которая начинается с "port=заканчивается на | echo $port", передавая результат собственной переменной себе... не то, что вы хотите здесь сделать. Редактировать: Не говоря уже о том, что это даже не запуск команды или создание переменной. Она просто неправильно сконструирована.

Если вы заранее зададите переменную порта, все станет еще проще.

read -p "Maquina : " maquina; read -p "SID : " sid; ssh ora$sid@`echo $maquina` "$PORT0"

решение4

grep -m1 PORT /ora$sid/dbs/listener.ora | sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/'

или

Измените if($count > NUM), чтобы ограничить количество возвращаемых совпадений, в данном случае это 3 совпадения.

perl -e 'my $count = 0; while(<>) { if(/PORT (\d+)/) {print "$1\n"; $count+=1; if($count > 2) {exit}} }' /ora$sid/dbs/listener.ora

Связанный контент