특정 문자열 다음에 특정 값을 추출하여 다른 변수에 저장하는 방법은 무엇입니까?

특정 문자열 다음에 특정 값을 추출하여 다른 변수에 저장하는 방법은 무엇입니까?

저는 Linux를 처음 접했습니다. 자동화가 끝나면 생성된 요약 파일을 구문 분석해야 합니다. 요약 파일은 다음과 같습니다.

Total_Test_Cases_Count:25
Total_Pass:24
Total_Fail:1
Execution_Duration:5m 7sec
Pass_Percentage:96.11%
Failure_Percentage:3.89%

이 값이 변수에 개별적으로 존재하여 다른 함수에 전달할 수 있기를 원합니다.

내 예상 결과:

Total_Test_Cases_Count(as a variable) with value 25.
Total_Pass(as a variable) with value 24.

다른 사람들에게도 마찬가지입니다.

내가 지금까지 시도한 것 :

awk "NR==1" summary.txt

이것은 만든다

TotalCount:25

답변1

이는 연관 배열을 사용하는 것이 가장 좋습니다. 예를 들어

declare -A array

while IFS=: read key val; do
  array["$key"]="$val"
done < input.txt

for key in Total_Test_Cases_Count Total_Pass; do
  printf '%s=%s\n' "$key" "${array[$key]}"
done

산출:

Total_Test_Cases_Count=25
Total_Pass=24

값에 필드 구분 기호(콜론, )가 포함되어 있으면 :이 작업이 실패합니다 . 이 경우 먼저 입력의 필드 구분 기호를 두 필드 모두에 존재하지 않는 구분 기호로 변경해야 합니다. 일반적으로 탭이 좋은 선택입니다. 예를 들어:

while IFS=$'\t' read key val; do
  array["$key"]="$val"
done < <(sed -e 's/:/\t/1' input.txt)

IFS는 탭 문자를 구분 기호로 사용하도록 설정되어 있으며 이 sed명령은 첫 번째(첫 번째만) 콜론 문자를 탭 문자로 변경합니다.

답변2

awk 및 eval을 사용하십시오.

eval "$(awk -F: '{ print $1 "='\''" $2 "'\''" }' tmp)"

summary.txt를 구문 분석하는 내부 명령입니다 $(). 이 옵션을 사용하면 awk에게 필드 구분 기호 -F로 사용하도록 지시합니다 . :각 줄의 형식은 다음과 같습니다.

Total_Pass='24'

나는해야만했다작은따옴표를 이스케이프하세요;그래서 코드가 보기 흉해 보입니다.

eval은 스크립트에서 작성하는 것처럼 서식이 지정된 텍스트를 수행하는 데 사용됩니다. 짐작할 수 있는 것은 이것이다.위험한입력 데이터를 완전히 제어할 수 없는 경우. 바라보다Bash에서 eval을 피해야 하는 이유는 무엇이며 대신 무엇을 사용해야 합니까?어쩌면 누군가가 이를 수행하는 더 안전한 방법을 지적할 수 있습니다.

그런 다음 다음과 같이 새 변수를 사용할 수 있습니다.

printf "Total_Pass with value %s\n" "$Total_Pass"

관련 정보