SH: сохранить вывод команды awk в переменных - PullRequest
1 голос
/ 03 мая 2020

У меня есть следующий код, который печатает

  1. Использование диска: 78/223 ГБ (35%)
  2. Загрузка процессора: 2,00
  3. Использование памяти: 5650/16302 МБ (34.66)

Но я хочу использовать в качестве переменных в скрипте bah, не предназначенном для их печати. Как я могу это сделать?

Что я хочу:

#!/bin/sh

# I want 3 variables which have values from awk 
# How can i convert awk command below to do that ?
$disk_usage
$CPU_usage
$Memory_usage

КОД:

awk 'BEGIN {
    while("df -hP " | getline) {
        if ( $NF == "/" ) {
            printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5
        }
    }
    while( getline  < "/proc/loadavg" ) {
        printf "CPU Load: %.2f\n", $(NF-2)
    }

    while( "free -m"| getline) {
        if( $0 ~ /Mem:/) {
        printf "Memory Usage: %s/%sMB (%.2f%)\n", $3,$2,$3*100/$2
        }
    }
}'

Ответы [ 3 ]

3 голосов
/ 03 мая 2020

с bash

#!/usr/bin/env bash

disk=
cpu_usage=
memory_usage=

while true; do
  read -r disk
  read -r cpu_usage
  read -r memory_usage
  break
done < <(awk -f tst.awk)

printf '%s\n' "$disk" "$cpu_usage" "$memory_usage"

, где tst.awk

BEGIN {
    while("df -hP " | getline) {
       if ( $NF == "/" ) {
          printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5
       }
    }
    while( getline  < "/proc/loadavg" ) {
       printf "CPU Load: %.2f\n", $(NF-2)
    }

    while( "free -m"| getline) {
      if( $0 ~ /Mem:/) {
       printf "Memory Usage: %s/%sMB (%.2f%)\n", $3,$2,$3*100/$2
       }
    }
}

Вместо отдельного скрипта для awk можно добавить код awk внутри замещения Process.

done < <(awk 'BEGIN {
    while("df -hP " | getline) {
       if ( $NF == "/" ) {
       printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5
       }
    }
    while( getline  < "/proc/loadavg" ) {
       printf "CPU Load: %.2f\n", $(NF-2)
    }

    while( "free -m"| getline) {
       if( $0 ~ /Mem:/) {
       printf "Memory Usage: %s/%sMB (%.2f%)\n", $3,$2,$3*100/$2
       }
    }
  }'
)

Без while l oop, с использованием { } для группировки команд.


{
  read -r disk_usage
  read -r cpu_usage
  read -r memory_usage
} < <( awk 'BEGIN {
  while("df -hP " | getline) {
   if ( $NF == "/" ) {
      printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5
    }
  }
   while( getline  < "/proc/loadavg" ) {
     printf "CPU Load: %.2f\n", $(NF-2)
  }
  while( "free -m"| getline) {
     if( $0 ~ /Mem:/) {
       printf "Memory Usage: %s/%sMB (%.2f%)\n", $3,$2,$3*100/$2
     }
   }
  }'
)

printf '%s\n' "$disk_usage" "$cpu_usage" "$memory_usage"
2 голосов
/ 03 мая 2020

Не могли бы вы попробовать следовать, вместо того, чтобы использовать bash команды (несколько команд) в одном awk, вы могли бы упростить это, сделав их различные секции команд, например:

cat script.bash
#!/bin/bash
FILESYSTEM="/"
##For disk space
DISK_USAGE=$(df -hP "$FILESYSTEM" | awk '{printf("Disk Usage: %s %s\n",$3,$2,$5)}')
##For Cpur
CPU_DETAILS=$(awk '{printf "CPU Load: %.2f\n", $(NF-2)}' /proc/loadavg)
##For Memory
MEMORY_DETAILS=$(free -m | awk '/Mem/{printf("Memory Usage: %s/%sMB (%.2f%)\n", $3,$2,$3*100/$2)}')
1 голос
/ 03 мая 2020

Это определит 3 переменные и выведет на экран:

#!/bin/bash

DISK_USAGE=$(awk 'BEGIN {
    while("df -hP " | getline) {
        if ( $NF == "/" ) {
            printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5
        }
    }
}')

CPU_LOAD=$(awk 'BEGIN {
    while( getline  < "/proc/loadavg" ) {
        printf "CPU Load: %.2f\n", $(NF-2)
    }
}')

MEMORY_USAGE=$(awk 'BEGIN {
    while( "free -m"| getline) {
        if( $0 ~ /Mem:/) {
        printf "Memory Usage: %s/%sMB (%.2f%)\n", $3,$2,$3*100/$2
        }
    }
}')

echo $DISK_USAGE
echo $CPU_LOAD
echo $MEMORY_USAGE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...