데이터베이스 이름 집합을 사용하여 각 데이터베이스 이름에 연결하고 이에 대해 저장 프로시저를 실행하는 bash 스크립트가 있습니다. 저장 프로시저의 출력에서 값을 가져와 스크립트의 나머지 부분에서 사용해야 합니다. 대부분의 출력은 다음과 같습니다.
CONDBAT= 10000 MDBAT= 400 ADBAT= 143 QUEDBAT= 167924 INADBAT= 0
그런 다음 일부 데이터베이스의 출력이 공백 없이 다른 것을 확인했습니다.
CONDBAT=4000 MDBAT=1200 ADBAT=263 QUEDBAT=7924 INADBAT=0
QUEDBAT 다음에 값을 가져와 변수로 저장해야 합니다. 내 문제는 두 출력의 값을 모두 얻을 수 없다는 것입니다. 나는 많은 명령을 시도했다. 예를 들어:
grep -Eo 'QUEDBAT=([[:space:]]+[^[:space:]]+){1}'
grep -vE -e 'QUEDBAT=[[:space:]]{4}' -e '^[^[:space:]]*$'
grep -oP '(?<=QUEDBAT\=)(\s+)?\K([^ ]*)'
그러나 두 출력의 값은 반환되지 않습니다. 공백을 무시하고 QUEDBAT 후에 값을 얻는 방법은 무엇입니까?
하나의 스크립트에 모든 데이터베이스의 모든 출력이 필요하기 때문에 별도의 스크립트를 작성할 수 없습니다. 저장 프로시저를 실행할 때마다 값이 바뀌기 때문에 각 섹션의 값이 3자리인지 4자리인지 확신할 수 없습니다. 그리고 때로는 출력 순서가 동일하지 않기 때문에 =
와 사이의 콘텐츠 도 가져올 수 없습니다 .ADBAT
답변1
+
예하나 이상. 당신은 *
해야합니다0 이상:
grep -Po '\bQUEDBAT=\s*\K\d+'
또는:
pcregrep -o1 '\bQUEDBAT=\s*(\d+)'
또는 이식성을 위해 실제 항목( P
위의 /represents)을 사용합니다.p
perl
perl -lne 'print $1 while /\bQUEDBAT=\s*(\d+)/g'
perl -lne 'print for /\bQUEDBAT=\s*(\d+)/g'
perl
(또는 주로 텍스트 처리와 관련된 경우 전체 스크립트를 작성하는 것이 더 적절할 수 있습니다).
답변2
입력에 태그=값 쌍이 있을 때마다 먼저 f[]
아래에서 이러한 매핑( )을 보관할 배열을 생성하는 것이 가장 좋습니다. 그런 다음 입력 순서에 관계없이 원하는 값을 가져오고 비교하고 재정렬하는 등의 작업을 수행할 수 있습니다. 단지 그들의 라벨입니다. 특정 요구 사항에 맞게 모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.
$ awk -F'[= ]+' '{for (i=1; i<NF; i+=2) f[$i]=$(i+1); print f["QUEDBAT"]}' file
167924
그러나 먼저 태그 값 배열을 구축하는 이러한 접근 방식을 사용하면 다음과 같이 더 많은 작업을 수행할 수 있습니다.
$ awk -F'[= ]+' '
{ for (i=1; i<NF; i+=2) f[$i]=$(i+1) }
(f["QUEDBAT"] > 500) && (f["MDBAT"] < f["CONDBAT"]) {
print f["INADBAT"], f["ADBAT"]
}
' file
0 143
답변3
tr+ sed
"="를 사용하여 필드를 구분하는 경우 파이프를 사용할 수 있습니다.
< file tr -s ' =' '\n' |
sed -n '/^QUEDBAT$/{n;p;}'
GNU sed
혼자서도 사용할 수 있습니다.
sed -E '
s/(^|\s)QUEDBAT=\s*(\S+)/\n\2\n/
s/.*\n//M;/\n/P;D
' file
결과:
167924
7924
답변4
awk -F "=" '{for(i=1;i<=NF;i++){if($i ~ /QUEDBAT/){gsub(/ *INADBAT/,"",$(i+1));gsub(/^[[:space:]]/,"",$(i+1));print $(i+1)};}}' filename
산출
167924
7924