쉘 스크립트를 이용하여 입력 문자열에서 여러 번 나타나는 두 단어 사이의 최대값을 추출하는 방법

쉘 스크립트를 이용하여 입력 문자열에서 여러 번 나타나는 두 단어 사이의 최대값을 추출하는 방법

명령 출력에서 ​​최대 온도 값을 추출하여 다음과 같은 셸 변수에 저장하고 싶습니다.

res="$(get temperature all)"

결과는 다음과 같습니다.

 Device 0 avs data:
    Temperature: 33.5 C
    voltage1V0:  0.926 V
    voltage1V8:  1.782 V
    voltage3V3:  3.265 V

 Device 1 avs data:
    Temperature: 32.6 C
    voltage1V0:  0.923 V
    voltage1V8:  1.780 V
    voltage3V3:  3.265 V

 Device 2 avs data:
    Temperature: 33.1 C
    voltage1V0:  0.920 V
    voltage1V8:  1.785 V
    voltage3V3:  3.290 V

 Device 3 avs data:
    Temperature: 33.1 C
    voltage1V0:  0.921 V
    voltage1V8:  1.780 V
    voltage3V3:  3.265 V

Temperature:문자열 사이의 숫자 값을 추출하고 C모든 장치 기록에서 최대 값을 찾고 싶습니다. 위의 경우 출력은 다음과 같아야 합니다.

33.5

온도값이 33.5, 32.6, 33.1, 33.1이기 때문에

위 명령의 출력은 다음과 같습니다.

  • 때로는 단지 정보일 뿐이지만 Device 0,
  • 때로는 Device 0정보Device 1
  • 가끔 Device 0,,, 정보Device 1Device 3Device 4

따라서 최대 온도를 찾는 논리는 장치 수에 관계없이 보편적이어야 합니다(최대 개수는 4개이지만 사용 가능한 최소 장치 개수는 1개입니다).

예를 들어, 장치가 하나만 있는 경우 최대 온도는 장치 0 온도와 같아야 하며, 그렇지 않으면 비교하고 인쇄해야 합니다.

편집 1- 반드시 사용해야 하거나 sed옵션 awkgrep -P제공되지 않습니다.

echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*(?=string)'

grep: invalid option -- 'P'

답변1

각 장치에는 다음이 포함될 수 있다고 가정합니다.단 하나"온도"를 읽고 최대값만 인쇄하려는 경우(관련 장치 번호는 인쇄하지 않음) 다음을 시도해 볼 수 있습니다.

awk '$1=="Temperature:" {if ($2>max) max=$2} END{printf("Maximum: %.1f\n",max)}'

그러면 공백으로 구분된 첫 번째 필드( ) $1가 있는 모든 행을 구문 분석하고 숫자 온도 값인 Temperature:두 번째 필드( )를 확인합니다 . $2값이 지금까지의 가장 큰 값보다 크면 변수에 저장됩니다 max(처음에는 0인 것처럼 동작함).

마지막으로 찾은 최대값을 인쇄합니다.

관련 정보