Как процессорный набор Linux можно перебрать с помощью shell? - PullRequest
0 голосов
/ 20 мая 2018

В файловой системе sys Linux представлены наборы идентификаторов процессоров с синтаксисом:

  1. 0,2,8: набор процессоров, содержащий 0, 2 и 8.
  2. 4-6: наборПроцессоры, содержащие 4, 5 и 6.
  3. Оба синтаксиса могут быть смешаны и сопоставлены, например: 0,2,4-6,8

Например, при запуске cat /sys/devices/system/cpu/online печать 0-3 на моеммашина, которая означает, что процессоры 0, 1, 2 и 3 подключены.

Проблема в том, что приведенный выше синтаксис сложно перебрать с помощью цикла for в сценарии оболочки.Как преобразовать приведенный выше синтаксис в еще один условный, такой как 0 2 4 5 6 8?

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Попробуйте:

$ echo 0,2,4-6,8 | awk '/-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next} 1' ORS=' ' RS=, FS=-
0 2 4 5 6 8

Это можно использовать в цикле следующим образом:

for n in $(echo 0,2,4-6,8 | awk '/-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next} 1' RS=, FS=-)
do
   echo cpu="$n"
done

, который производит вывод:

cpu=0
cpu=2
cpu=4
cpu=5
cpu=6
cpu=8

Или как:

printf "%s" 0,2,4-6,8 | awk '/-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next} 1' RS=, FS=- | while read n
do
   echo cpu="$n"
done

, который также производит:

cpu=0
cpu=2
cpu=4
cpu=5
cpu=6
cpu=8

Как это работает

Команда awk работает следующим образом:

  • RS=,

    Это говорит awk использовать , в качестве разделителя записей.

    Если, например, ввод 0,2,4-6,8, то awk увидит четыре записи: 0и 2 и 4-6 и 8.

  • FS=-

    Это говорит awk об использовании - в качестве разделителя полей.

    Если установить FS таким образом, и, например, если входная запись состоит из 2-4, то awk увидит 2 в качестве первого поля и 4 в качестве второго поля.

  • /-/{for (i=$1; i<=$2; i++)printf "%s%s",i,ORS;next}

    Для любой записи, содержащей -, мы печатаем каждое число, начиная со значения первого поля, $1 и заканчивая значениемвторое поле, $2.За каждым таким номером следует разделитель выходных записей, ORS.По умолчанию ORS является символом новой строки.Для некоторых из приведенных выше примеров мы устанавливаем пустое значение ORS.

    После того, как мы напечатали эти числа, мы пропускаем остальные команды и переходим к записи next.

  • 1

    Если мы попадем сюда, то запись не будет содержать -, и мы распечатаем ее как есть.1 является сокращением awk для печати строки.

0 голосов
/ 20 мая 2018

Perl one:

echo "0,2,4-6,8" | perl -lpe 's/(\d+)-(\d+)/{$1..$2}/g; $_="echo {$_}"' | bash

Просто преобразуйте исходную строку в echo {0,2,{4..6},8} и позвольте bash 'brace extension' интерполировать ее.

0 голосов
/ 20 мая 2018
eval echo $(cat /sys/devices/system/cpu/online | sed 's/\([[:digit:]]\+\)-\([[:digit:]]\+\)/$(seq \1 \2)/g' | tr , ' ')

Объяснение:

  1. cat /sys/devices/system/cpu/online читает файл из sysfs.Это может быть изменено на любой другой файл, такой как offline.
  2. . Выходные данные передаются через подстановку s/\([[:digit:]]\+\)-\([[:digit:]]\+\)/$(seq \1 \2)/g.Это соответствует чему-то вроде 4-6 и заменяет его на $(seq 4 6).
  3. tr , ' ' заменяет все запятые пробелами.
  4. В этот момент вход 0,2,4-6,8 преобразуется в 0 2 $(seq 4 6) 8.Последний шаг - eval этой последовательности, чтобы получить 0 2 4 5 6 8.
  5. Пример echo - это вывод.Кроме того, его можно записать в переменную или использовать в цикле for.
...