일치 후 공백 유무에 관계없이 값을 얻는 방법은 무엇입니까?

일치 후 공백 유무에 관계없이 값을 얻는 방법은 무엇입니까?

데이터베이스 이름 집합을 사용하여 각 데이터베이스 이름에 연결하고 이에 대해 저장 프로시저를 실행하는 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)을 사용합니다.pperl

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

관련 정보