1

Например,

Если вы делаете free -m | sed -n 2p

Я хочу работать с выводом из последнего, второго до последнего и третьего столбцов. Проблема в том, что я хочу, чтобы он был единообразным и один раз использовал вывод из free .

Я хочу, чтобы вывод был согласованным без запуска free -m | sed -n 2p и извлечение трех нужных мне столбцов три раза; Я хочу быть в состоянии сделать это один раз. Как я могу это сделать?

4 ответа4

3

Вы могли бы хотеть дать Awk водоворот для этого.

[root@james-ws tmp]# free -m | sed -n 2p
Mem:          3948       3724        223          0        364        852
[root@james-ws tmp]# free -m | sed -n 2p | awk '{print $7, $6, $3}'
852 364 3718
1

Я думаю, что самый простой способ сделать это - сохранить строку статистики в массиве bash, а затем получить доступ к элементам массива:

memStats=( $(free -m | sed -n 2p) )
memStatElements=${#memStats[@]}
echo "last column: ${memStats[memStatElements-1]}"
echo "second-to-last column: ${memStats[memStatElements-2]}"
echo "second column: ${memStats[1]}" # Note that arrays are 0-based, so [1] is the second element
1

Вы можете использовать именованные каналы и awk чтобы разделить вывод на 3 источника. Затем вы можете прочитать (один раз) из каждого источника.

mkfifo pipe1 pipe2 pipe3
free -m | sed -n 2p | awk '{ print $3 >> pipe1; print $6 >> pipe2; print $7 >> pipe3 }'

Названные трубы pipe1 и соавт. действуют как буферы, из которых вы можете читать, как если бы они были конвейерами.

cat pipe1 | this | that | the-other

или желательно без cat:

this < pipe1 | that | the-other

Обратите внимание, что когда вы читаете данные из канала, данные исчезают, как если бы ваш ввод поступил из обычного канала.

0

Вместо этого я решил просто сохранить free результат в переменной и отображать каждый результат отдельно.

Это мой конечный результат:

STRINGMEM=$(free -m | sed -n 2p | awk '{ print $7,$6,$3 }'); CACHED=$( echo $STRINGMEM | awk '{print $3}'); BUFFERED=$(echo $STRINGMEM | awk '{print $2}'); ACTIVE=$(echo $STRINGMEM | awk '{print $1}'); ACTIVE=$( (( ($BUFFERED + $CACHED) - $ACTIVE)) ); DATE=$(date +%s);

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .