
출력이 다음과 같은 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
.