두 개의 값을 반환하는 문장이 있습니다.
cat /ora$sid/dbs/listener.ora|grep PORT|sed 's/.*PORT.*\([0-9]\{4\}\)\(.*\)/\1/'
Return
1521
1522
이 문장으로 나는 단지 가치를 얻고 싶습니다. 이 값을 변수에 저장하여 sqlplus 문자열을 작성하여 oracle 데이터베이스에 자동으로 연결한 다음 명령을 실행하고 싶습니다.
반환되는 결과 수를 제한하고 나중에 다른 명령에서 해당 값을 사용할 수 있도록 변수에 저장하려면 어떻게 해야 합니까?
고쳐 쓰다:
이 문장을 ssh 호출에 추가했지만 실행하면 아무 값도 얻지 못합니다(헤드 -1에서는 ssh 호출이 제대로 작동하지 않습니다).
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
편집된 줄을 인쇄하기 위해 교체하는 데 사용되는 PORT가 포함된 줄을 찾기 위해
-n
자동 인쇄를 억제하는 데 사용되는 정규식에 사용됩니다.
/PORT/
s/
/p
둘 중 하나의 값을 얻으려면 head 또는 tail을 사용하십시오.
$PORT0=(sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora | 헤더 -1)
또는 둘 다 원하는 경우:
scrap_port () { sed -rn '/PORT/ s/.*([0-9]{4}).*/\1/p' /ora$sid/dbs/listener.ora } $PORT0=$(grab_port|헤드-1) $PORT1=$(grab_port|tail-1)
이제 라인을 살펴 보겠습니다.
읽기 -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/ ' | echo $port"
"port=
자체 변수의 결과를 자체적으로 파이핑하는 것으로 끝나는 섹션으로 시작하는 것은 | echo $port"
여기서 수행하려는 작업이 아닙니다. 편집: 말할 것도 없이 명령을 실행하거나 변수를 생성하지도 않습니다. 단지 올바르게 구축되지 않았을 뿐입니다.
포트 변수를 미리 설정해 놓으면 더 쉽습니다.
-p "Maquina:"maquina 읽기; -p "SID:"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