как получить несколько выводов команд в качестве переменной в awk

Вопрос или проблема

Я пытаюсь выполнить 3 команды и получить вывод в виде переменной, которая требует некоторого процентного вычисления и отображает то же, что и в примере. Можно ли это выполнить в виде скрипта?

Вывод первой команды

$ isi status -q | grep -e "^Size" -e "^Used" -e "^Avail"
Size:573T
Used:448.0T
Avail:74T

Вывод второй команды

$ isi_classic snapshot usage | tail -n 1 | awk '{printf "\t\t\tSnapshot USED %=%.1f%%\n", $4}'
     Snapshot USED =0.6%
$ isi_classic snapshot usage | tail -n -1 | awk '{ print "\t\t\tSnapshot USED:" $1}'
     Snapshot USED=3.2T

пример скрипта awk скрипт не работает. после удаления пробела

# isi status -q | grep -e "^Size" -e "^Used" -e "^Avail" | awk 'function print (num)
pipe pipe quote> /Size:/ {TotalSize=$NF~}
pipe pipe quote> /Used:/ {TotalUsed=$NF}
pipe pipe quote> /Avail:/ {TotalAvail=$NF} }
pipe pipe quote> END {
pipe pipe quote>     used=TotalUsed/Total_Size*100
pipe pipe quote>     system("isi_classic snapshot usage | tail -n -1 | awk '{ print "Snapshot_used=" $1}'")
pipe pipe quote>     system("isi_classic snapshot usage | tail -n 1 | awk '{printf "Snapshot_per :%.1f\n", $4}'")
pipe pipe quote>     Usedw/o=Total Used-Snapshot USED/Total Size
pipe pipe quote>     print hostname ": " "\t","Total Size:" Total_Size
pipe pipe quote>     printf "\t\t\tTotalUsed:%.1f\n", TotalUsed, "TB"
pipe pipe quote>     printf "\t\t\tTotalAvail:%.1f\n", TotalAvail, "TB"
pipe pipe quote>     printf "\t\t\tTotalUsed %:%.1f\n", used, "TB"
pipe pipe quote>     printf "\t\t\tSnapshot Used :%.1f\n", Snapshot_used, "TB"
pipe pipe quote>     printf "\t\t\tSnapshot Used %:%.1f\n", Snapshot_per, "TB"
pipe pipe quote>     printf "\t\t\tUsed w/o:%.1f\n", Usedw/o, TB)'
awk: syntax error at source line 1
 context is
        function >>>  print <<<  (num)
        missing }
        missing )
awk: bailing out at source line 7

Требования к примеру

Total Size      : 573 TB
Total Used      : 448.0 TB
Total Available : 74 TB
Total Used %    : 86.1 %   # Total Used(%) = Total Used/Total Size *100 = 86.1(%)
Snapshot Used   : 3.2 TB
Snapshot Used % : 0.6 %
Used w/o        : 85.5 %    # {(Total used)-(Snapshot used)} / (Total size) = 85.49%

Оригинальный ответ:

Totalanswer=$(command1 ; command2)
Subanswer1=$(echo $Totalanswer|grep Sub1)
Subanswer2=$(echo $Totalanswer|grep Sub2)
printf " Answer1:%s\n Answer2:%s\n" $Subanswer1 $SubAnswer2

Добавленный комментарий: Хитрость заключается в получении необходимой информации с помощью правильных инструментов. Использование внешней (не родной для оболочки) команды следует избегать. Заменить greps средствами bash (намек) оставлено в качестве упражнения для читателя.

Ответ или решение

Теория:

Работа с командной строкой и различными утилитами Unix часто требует сложной обработки данных, где результаты нескольких команд должны быть обработаны и представлены в определенной форме. В таких задачах инструменты вроде awk становятся незаменимыми благодаря своим мощным возможностям обработки текстов и чисел. awk позволяет извлекать, манипулировать и преобразовывать данные из входных потоков, что делает его универсальным инструментом для создания различных отчетов и расчетов непосредственно из командной строки. Однако сложные сценарии, включающие несколько команд и последующую обработку их результатов, требуют более системного подхода, иногда с использованием парсеров и дополнительных команд оболочки.

Пример:

Рассмотрим задачу, которую вы описали, на примере данных, которые вы представили. У нас есть данные о размере, использованной и доступной памяти на сервере, а также использование пространства снапшотов:

  • Размер файловой системы: Size:573T
  • Использовано: Used:448.0T
  • Доступно: Avail:74T
  • Использование снапшотов: Snapshot USED=3.2T и Snapshot USED %=0.6%

Для выполнения всех необходимых расчетов, в первую очередь, нужно извлечь все эти данные и сохранить их в переменные. Затем можно использовать awk, чтобы произвести нужные математические операции, такие как вычисление процентного использования и оставшегося места без учета снапшотов.

Реализация:

Вот пример сценария, который выполняет данную задачу:

#!/bin/bash

# Выполнить первую команду и извлечь необходимые значения
output=$(isi status -q | grep -e "^Size" -e "^Used" -e "^Avail")
TotalSize=$(echo "$output" | awk -F ':' '/^Size/ {gsub(/[T ]/, "", $2); print $2}')
TotalUsed=$(echo "$output" | awk -F ':' '/^Used/ {gsub(/[T ]/, "", $2); print $2}')
TotalAvail=$(echo "$output" | awk -F ':' '/^Avail/ {gsub(/[T ]/, "", $2); print $2}')

# Выполнить вторую команду для получения данных о снапшотах
snapshot_output=$(isi_classic snapshot usage | tail -n 1)
SnapshotWithPercent=$(echo "$snapshot_output" | awk '{gsub("%",""); printf "%.1f\n", $4}')
SnapshotUsed=$(isi_classic snapshot usage | tail -n -1 | awk '{gsub(/[T ]/, "", $1); print $1}')

# Выполнить расчеты
TotalUsedPercent=$(awk -v used="$TotalUsed" -v size="$TotalSize" 'BEGIN {printf "%.1f", (used/size)*100}')
UsedWithoutSnapshot=$(awk -v used="$TotalUsed" -v snapshot="$SnapshotUsed" -v size="$TotalSize" 'BEGIN {printf "%.1f", ((used-snapshot)/size)*100}')

# Вывод результатов в форматированном виде
echo "Total Size      : $TotalSize TB"
echo "Total Used      : $TotalUsed TB"
echo "Total Available : $TotalAvail TB"
echo "Total Used %    : $TotalUsedPercent %"
echo "Snapshot Used   : $SnapshotUsed TB"
echo "Snapshot Used % : $SnapshotWithPercent %"
echo "Used w/o        : $UsedWithoutSnapshot %"

Применение:

Этот сценарий выполняет все необходимые команды и обработки для получения требуемых данных и их расчета. Он основывается на использовании awk для извлечения данных из строковых значений и выполнения арифметических операций. Некоторые ключевые моменты:

  1. Извлечение даных: Каждый кусочек данных извлекается с помощью awk, применяя регулярные выражения и замены, чтобы избавиться от нежелательных символов и единиц измерения (например, T).

  2. Математические операции: awk также используется для выполнения арифметических операций напрямую в командной строке, что упрощает расчеты и позволяет избежать использования дополнительных утилит или языков программирования.

  3. Гибкость: Решение может быть расширено и адаптировано для работы с другими наборами данных или другими командами, просто модифицируя регулярные выражения и логику расчета.

Как видно, сценарий написан таким образом, чтобы быть максимально читаемым и легким в поддержке. Используя подобный подход, вы можете создавать эффективные и динамичные отчеты из командной строки, что способствует автоматизации рутинных задач и более быстрому получению аналитики по ресурсам.

Оцените материал
Добавить комментарий

Капча загружается...