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

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

IBM 스크립트를 통해 루프를 사용하여 for loop디렉토리 크기를 얻는 스크립트를 만들었습니다. 그런 다음 스크립트는 쉽게 볼 수 있도록 디렉터리 크기와 경로를 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이는 가장 깔끔한 출력이 아니므로 위 예제의 디렉터리 크기를 이라는 변수 SIZESPI이라는 다른 변수로 파이프하고 싶습니다 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
  }')"

일부 awk구현(예: nawkSolaris 또는 이전) mawk또는 이전 버전은 / 정규식 간격 연산자를 gawk지원하지 않습니다 (이전(고대 아님) 버전의 경우 이를 지원하는 환경에서 실행할 수 있음 ). 25년 이상. 이를 위해서는 로 바꿔야 합니다 .{x,y}{x}gawkPOSIXLY_CORRECT=anything[[:upper:]]{3}[[:upper:]][[:upper:]][[:upper:]]

답변2

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

1부(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- 전체 행이 아닌 grep의 객체만 반환
-E- 확장 정규식
[[:upper:]]- 대문자만 일치([AZ], 로케일은 아님)
{3}- 일치를 정확히 3개의 연속 문자로 제한합니다.
[[:digit:]]- 숫자와 일치([0-9], 다시 로케일에 관계 없음)
+- 1회 이상 일치
\.- 점과 일치
(...)?- 0 또는 1회 일치 - 이렇게 하면 소수점이 없는 숫자도 캡처할 수 있습니다.
[xy]- 항목과 정확하게 일치합니다. x 또는 y.

관련 정보