Справка по сценарию Bash — проверка шестнадцатеричного значения между несколькими диапазонами

#bash

#bash

Вопрос:

Я пытаюсь написать скрипт bash, который будет принимать входные данные из dmidecode и сопоставлять определенный адрес памяти с DIMM, и мои попытки до сих пор были безуспешными, не стоит делиться.

Вывод, о котором идет речь, получен из (с образцом вывода)

 dmidecode -t 20

Handle 0x0036, DMI type 20, 35 bytes
Memory Device Mapped Address
        Starting Address: 0x00000000000
        Ending Address: 0x001FFFFFFFF
        Range Size: 8 GB
        Physical Device Handle: 0x001C
        Memory Array Mapped Address Handle: 0x0035
        Partition Row Position: 1

Handle 0x0037, DMI type 20, 35 bytes
Memory Device Mapped Address
        Starting Address: 0x00200000000
        Ending Address: 0x003FFFFFFFF
        Range Size: 8 GB
        Physical Device Handle: 0x001E
        Memory Array Mapped Address Handle: 0x0035
        Partition Row Position: 2
  

В зависимости от системы может быть от 1 диапазона до нескольких

Учитывая заранее определенный адрес памяти, например, 0x3fffffffe, мне нужно определить диапазон, в который он попадает между начальным адресом и конечным адресом

Следующим шагом будет показать, что диапазоны дескриптора физического устройства

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

 #!/bin/bash

dmidecode -t 20 > addrrng
grep 'Starting Address' addrrng | awk -F': ' '{ print $2 }' > startaddr

for i in cat startaddr; do
        if [ $1 -gt $i ]
           then
                grep -A3 $i addrrng
                break
        fi
done
  

Строка ошибки 7: [: 0x003fffffffe: ожидается целочисленное выражение

Комментарии:

1. Я знаю, что вы, вероятно, разочарованы своими неудачными попытками, но в отсутствие конкретного технического вопроса остается, по сути, просто чрезмерно широкий, открытый вопрос: «Можете ли вы сделать мою работу за меня?» своего рода вопрос. Возможно, это не входит в ваши намерения, но это все, что вы дали кому-либо для работы.

2. Сказав это, я полагаю, что неопределенный вопрос заслуживает неопределенного ответа, так что… Рассматривали ли вы возможность использования grep and awk (или, возможно sed , или cut вместо awk ) для сбора всех начальных адресов в массив, а затем сделайте то же самое, чтобы получить все конечные адреса во второй массив? (Обязательно используйте sort также, чтобы каждый массив увеличивался в порядке возрастания). Затем вы могли бы реализовать алгоритм поиска, который будет «обходить» массивы и находить соответствующие начальный и конечный адреса.

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

4. Вы получаете эту ошибку, потому bash что не знаете, как обрабатывать шестнадцатеричные значения. Он знает только, как обращаться с числами в десятичной системе счисления. * Поэтому, прежде чем вы сможете сравнить два числа с -gt , вам нужно преобразовать их в десятичную систему счисления. Простой способ, который я нашел для этого, — использовать printf ( bash встроенную, а не функцию C). Например, вы можете сделать var=$(printf "%d" "0x100") , который будет установлен var в 256 . * (все переменные bash хранятся внутри в виде простых текстовых строк, четных чисел. bash затем преобразует обратно и вперед между строками и числами по мере необходимости, но только в / из десятичного числа)

Ответ №1:

Если GNU awk доступен:

 dmidecode -t 20|gawk -v address=0x3fffffffe 'BEGIN{address=strtonum(address)}
               /^Handle/ {handle=$0}
               /Starting Address/ {start=strtonum($NF)}
               /Ending Address/{
                    end=strtonum($NF)
                    if ( address >= start amp;amp; address <=end) {
                        print "handle: "handle;start=end=""}
                       }'
  

Даст вам:

 handle: Handle 0x0037, DMI type 20, 35 bytes
  

Комментарии:

1. Спасибо всем за ввод и спасибо klashxx за сценарий gawk