두 개의 값을 반환하는 문장이 있습니다.
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