У меня есть предложение, которое возвращает два значения.
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