발견된 정규식 세트를 사용하여 다른 함수를 평가하기 위해 bash를 사용하는 함수 출력의 정규식

발견된 정규식 세트를 사용하여 다른 함수를 평가하기 위해 bash를 사용하는 함수 출력의 정규식

출력이 다음과 같은 bash 함수 FUNCTION_A가 있습니다.

    ID          HELD_SINCE  HOLD_REASON
    123456.0   7/1  20:40 Peak usage: 2370 megabytes.
    123457.0   7/1  20:40 Peak usage: 5008 megabytes.

그런 다음 FUNCTION_B에 전달하려면 ID number합계 뒤에 숫자를 가져와야 합니다 .Peak usage:

수동으로 실행하면 다음과 같습니다.

FUNCTION_B 123456.0 2370
FUNCTION_B 123457.0 5008

나는 정규식을 사용하여 이 두 숫자를 얻고 쉘에서 임의의 숫자를 실행하는 bash 스크립트를 작성하려고 합니다 FUNCTION_A. 몇 가지 다른 위치에 있습니다.

출력을 한 줄씩 반복하는 방법을 잘 모르겠고 왜 배열에 출력이 없는지 잘 모르겠지만 다음과 같은 작업을 하고 싶습니다.

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
for line in FUNCTION_A output
   if [[ line =~ $re ]]; then
      myArray=($(echo s | egrep -Eo re))
      eval FUNCTION_B ${myArray[0]} ${myArray[1]}
   fi  

답변1

Bash에서 캡처 브래킷을 사용할 수 있습니다.BASH_REMATCH변수

function_A_output=$(FUNCTION_A)

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while IFS= read -r line; do
   if [[ $line =~ $re ]]; then
      FUNCTION_B "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
   fi  
done <<<"$function_A_output"

요구 사항이 없습니다 eval.

사용하다프로세스 교체, $function_A_output 변수가 필요하지 않습니다.

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while IFS= read -r line; do
   if [[ $line =~ $re ]]; then
      FUNCTION_B "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
   fi  
done < <$(FUNCTION_A)
# ....^ that space is intentional

답변2

나는 bash 또는 sh의 방언으로 이것을 작성하지 않지만 (이미 주석에서 언급한 이유로) 하나의 함수 출력에서 ​​숫자 값을 추출하여 한 번에 두 개씩 전달하려고 하는 것처럼 보입니다. 두 번째 기능으로?

이것이 맞다면 다음과 같이 할 수 있습니다.

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while read -r a b ; do
  FUNCTION_B "$a" "$b"
done < <(FUNCTION_A | sed -nE "s/$re/\1 \2/p")

$re하지만 나는 이것을 믿는지 완전히 확신하지 못합니다. 그것이 무엇이든 sed 스크립트를 깨뜨리기가 너무 쉽습니다 . -v옵션을 통해 $re를 awk에 전달하거나 awk 또는 perl에 내보낸 환경 변수로 전달하는 것이 가장 좋습니다 .

예를 들어

export re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while read -r a b ; do
  FUNCTION_B "$a" "$b"
done < <(FUNCTION_A | perl -n -e 'print "$1 $2\n" if m/$ENV{re}/')

그러나 나는 당신이 학습 awk및/또는 perl.. sed에도 시간을 할애할 것을 적극 권장합니다 grep.

관련 정보