Grep 3 대문자와 숫자를 두 개의 변수로 변환

Grep 3 대문자와 숫자를 두 개의 변수로 변환

for loop디렉토리 크기를 얻기 위해 IBM 스크립트를 반복하는 데 사용하는 스크립트를 만들었습니다 . 그런 다음 스크립트는 쉽게 볼 수 있도록 디렉터리 크기와 경로를 Slack 채널로 출력합니다. 프로그램은 작동하지만 IBM 스크립트의 출력이 크기 때문에 Slack에서 쉽게 읽을 수 있도록 형식을 지정해야 합니다. 따라서 Slack 메시지를 생성하는 데 사용되는 변수와 함께 두 개의 별도 변수로 파이프될 두 가지 정보를 수집해야 합니다. 내 스크립트는 다음과 같습니다

SIZE () {
  for dir in /path/to/dir/*
  do
    cd /usr/lpp/mmfs/samples/ilm/
    SLACKMESSAGE=$(./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h)
    SLACK
  done
}

상위 디렉토리도 마찬가지 /path/to/dir/*이며 IBM 스크립트는 ./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h 모든 하위 디렉토리(한 레벨 깊이)를 반복하여 크기를 가져옵니다. 출력은 다음과 같습니다.

[I] 2018-05-31@16:32:55.798 Policy execution. 0 files dispatched.
[I] 2018-05-31@16:32:55.804 Policy execution. 0 files dispatched.
File system scan complete.
534.5M     total
mmapplypolicy du for /path/to/directory/SPI/ complete at Thu May 31 17:32:55 2018

534.5M이는 가장 깔끔한 출력이 아니므로 위 예제 사례의 디렉터리 크기를 이라는 변수에 파이프 SIZE하고 이라는 SPI다른 변수에 파이프하고 싶습니다 PROJECT. 물론 루프이기 때문에 SIZEPROJECT변수는 위의 예제 내부의 각 디렉터리에서 변경됩니다 /path/to/dir/. 위 함수에서 호출되는 Slack 함수는 이 두 변수를 사용합니다. 이 두 가지를 변수로 만드는 방법을 찾는 데 어려움을 겪고 있습니다. 누구든지 해결책이 있습니까? 감사해요!

답변1

한 번에 수행하려면:

eval "$(yourscript | awk -v q=\' '
  $1 ~ /^[[:digit:]]+(\.[[:digit:]]+)?[MGT]$/ {
    print "SIZE=" $1
  }
  match($0, /[[:upper:]]{3}/) {
    print "PROJECT="q substr($0, RSTART, RLENGTH) q
  }')"

또는 Solaris 또는 이전 버전 과 같은 일부 awk구현은 / 정규식 간격 연산자를 지원하지 않습니다 . (이전(고대 아님) 버전의 경우 지원하도록 환경에서 실행할 수 있음) 하지만) 비록 그것이 25년 넘게 표준이 되었음에도 말이죠. 이를 사용하면 으로 교체해야 합니다 .nawkmawkgawk{x,y}{x}gawkPOSIXLY_CORRECT=anything[[:upper:]]{3}[[:upper:]][[:upper:]][[:upper:]]

답변2

이것이 당신에게 필요한 것인지 의심스럽습니다. 그러나 이것은 현재 질문에 대한 답변을 그대로 전달합니다.

첫 번째 부분(GNU grep또는 호환 가능하다고 가정):

project="$(yourscript|grep -oE '[[:upper:]]{3}')"

두 번째 부분:

size="$(yourscript|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"

결합하면 스크립트를 한 번 실행하고 출력을 저장하고 grep을 저장하고 저장된 출력에 할당하는 것이 더 간단합니다.

output="$(script)"
size="$(printf '%s\n' "$output"|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"
project="$(printf '%s\n' "$output"|grep -oE '[[:upper:]]{3}')"

일부 설명
grep -o- 전체 줄이 아닌 파악된 개체만 반환
-E- 확장 정규식
[[:upper:]]- 대문자만 일치([AZ], 그러나 로케일에 관계 없음)
{3}- 일치를 정확히 3개의 연속 문자로 제한합니다.
[[:digit:]]- 숫자 일치([0-9], 다시 로케일과 관련 없음)
+- 1회 이상 일치
\.- 점 일치
(...)?- 0 또는 1회 일치 - 이렇게 하면 소수점이 없는 숫자도 캡처될 수 있습니다.
[xy]- 정확히 1개와 일치합니다. x 또는 y 항목 중

관련 정보