Performance BASH:一次设置多个变量/性能

Performance BASH:一次设置多个变量/性能,performance,bash,variables,gcc,elf,Performance,Bash,Variables,Gcc,Elf,我正在使用msys和mingw环境在windows上运行bash脚本。我似乎有一个问题,使用像“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 l

我正在使用msys和mingw环境在windows上运行bash脚本。我似乎有一个问题,使用像“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线让我慢了下来,所以我把它去掉了,我只是用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等变量,那将非常有帮助

echo "$SOMETHING" | while read -r junk OFFSET VIRTADDR PHYSADDR FILESIZE MEMSIZE junk2; do
     echo $OFFSET $VIRTADDR $PHYSADDR $FILESIZE $MEMSIZE 
done
cut
实用程序可用于一次提取多个字段

或者,如果要进一步处理数据,可以使用awk:

echo "$SOMETHING" | awk '{ print($2, $3, $4, $5, $6); }'
awk
工具在单词边界上分割输入,因此您不必计算空格字符。您可以通过
$NF
到达每行的最后一个单词,通过
$(NF-1)
到达倒数第二个单词


根据您对数据的处理方式,使用
perl
可能更合适。

+1,但您需要放弃字段1到11。(偏移量是第12栏,不是第2栏)不,我没有
read
拆分字段的方式与
cut-d\
不同;没有看问题的内容谢谢你rob mayoff,你的回答太棒了:)它跑得太快了!当心,我遇到了这个问题:
echo "$SOMETHING" | awk '{ print($2, $3, $4, $5, $6); }'