BASH: установить несколько переменных одновременно / производительность - PullRequest
2 голосов
/ 01 ноября 2011

Я запускаю bash-скрипты в Windows, используя среду msys и mingw.У меня, кажется, есть проблема, когда использование команды вроде 'cut' или sed 'вызывает накладные расходы для каждого вызова.Я не уверен, если это эффект Windows работает. EXE или что.В любом случае вот мой код:

SOMETHING=`m6811-elf-readelf.exe -l "${TARGET_BASENAME}.elf" | sed '1,/Type / d' | sed '1,/^$/!d'`

echo "$SOMETHING" | while read -r line; do 
    # MEMORY_ADDRESSES=`echo $line | sed -ne 's/LOAD[^0-9a-z]*0x\([^ ]*\) 0x\([^ ]*\) 0x\([^ ]*\) 0x\([^ ]*\) 0x\([^ ]*\) .*/\1 \2 \3 \4 \5/p;'`
     OFFSET=`echo "$line" | cut -f12 -d\ `
     VIRTADDR=`echo "$line" | cut -f13 -d\ `
     PHYSADDR=`echo "$line" | cut -f14 -d\ `
     FILESIZE=`echo "$line" | cut -f15 -d\ `
     MEMSIZE=`echo "$line" | cut -f16 -d\ `
     echo $OFFSET $VIRTADDR $PHYSADDR $FILESIZE $MEMSIZE 
done

Я бы хотел, чтобы это работало как можно быстрее.Я подумал, что Sed Line замедляет меня, поэтому я удалил его, и я просто использую Cut.Для каждой линии разреза, которую я использую, этот код намного медленнее.

Содержимое переменной SOMTHING:

  LOAD           0x000000 0x00000000 0x00000000 0x00680 0x00680 RW  0x1000
  LOAD           0x001100 0x00002100 0x00002100 0x00000 0x0005a R   0x1000
  LOAD           0x00115a 0x0000215a 0x0000215a 0x00615 0x00669 RWE 0x1000
  LOAD           0x002000 0x00010000 0x00008000 0x00056 0x00056 R E 0x1000
  LOAD           0x003000 0x00018000 0x00028000 0x03ffe 0x03ffe R E 0x1000
  LOAD           0x007000 0x0001c000 0x00038000 0x03e60 0x03e60 R E 0x1000
  LOAD           0x00b000 0x00020000 0x00048000 0x021b5 0x021b5 R E 0x1000
  LOAD           0x00e000 0x00024000 0x00058000 0x0236a 0x0236a R E 0x1000

Цель этого кода - извлечь каждый шестнадцатеричный адрес изВывод $ SOMETHING, чтобы я мог сделать простую математику.Поскольку этот файл становится длиннее (до 20 строк), он становится довольно медленным.

Если вы знаете эффективный способ назначения переменных OFFSET, VIRTADDR, PHYSADDR и т. Д., Это очень поможет !!

Ответы [ 2 ]

6 голосов
/ 01 ноября 2011
echo "$SOMETHING" | while read -r junk OFFSET VIRTADDR PHYSADDR FILESIZE MEMSIZE junk2; do
     echo $OFFSET $VIRTADDR $PHYSADDR $FILESIZE $MEMSIZE 
done
0 голосов
/ 01 ноября 2011
echo "$SOMETHING" | cut -d ' ' -f 11-15

Утилита cut может использоваться для извлечения более чем одного поля за раз.

Или, если вы хотите обрабатывать данные дальше, вы можете использовать awk:

echo "$SOMETHING" | awk '{ print($2, $3, $4, $5, $6); }'

Инструмент awk разбивает ввод по границам слов , поэтому вам не нужно считать пробелы.Вы можете добраться до последнего слова каждой строки на $NF и от второго до последнего слова на $(NF - 1).

В зависимости от того, что вы делаете с данными, использование perl может быть даже более подходящим.

...