하나의 값을 반환하고 변수에 저장합니다.

하나의 값을 반환하고 변수에 저장합니다.

두 개의 값을 반환하는 문장이 있습니다.

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

Return
1521
1522

이 문장에서는 단 하나의 값만 얻고 싶습니다. 이 값을 변수에 저장하여 Oracle 데이터베이스에 자동으로 연결한 다음 명령을 실행하는 sqlplus 문자열을 작성하고 싶습니다.

반환되는 결과 수를 제한하고 이를 변수에 저장하려면 어떻게 해야 합니까? 나중에 이 값을 다른 명령에서 사용합니까?

업데이트:

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 | 헤드 -1)

또는 둘 다 원하는 경우:

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

이제 귀하의 라인을 살펴 보겠습니다.

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

"port=로 시작하는 부분은 | echo $port"자체 변수의 결과를 자체적으로 파이핑합니다. 여기서는 원하는 작업이 아닙니다. 편집: 명령을 실행하거나 변수를 만들지 않는다는 것은 말할 것도 없습니다. 단지 제대로 구축되지 않았을 뿐입니다.

포트 변수를 미리 설정해 놓으면 편해집니다.

read -p "마퀴나 : " maquina; 읽기 -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

관련 정보