#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
andawk
(или, возможно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