2011-11-01 47 views
2

我在windows上使用msys和mingw环境运行bash脚本。我似乎有一个问题,使用类似'cut'或sed'的命令会导致每次调用的开销。我不确定这是Windows运行.exe的还是什么的影响。无论如何,这里是我的代码:BASH:一次设置多个变量/性能

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。对于我使用的每条切割线,此代码要慢得多。

的财产以后变量的内容是:

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等变量,这将有很大的帮助!

回答

6
echo "$SOMETHING" | while read -r junk OFFSET VIRTADDR PHYSADDR FILESIZE MEMSIZE junk2; do 
    echo $OFFSET $VIRTADDR $PHYSADDR $FILESIZE $MEMSIZE 
done 
+0

+1,但你需要丢弃字段1到11.(OFFSET是字段12,而不是字段2) –

+2

不,我不知道。 'read'分割字段与'cut -d \'不同。 –

+0

我的不好;没有看问题中的东西的内容 –

0
echo "$SOMETHING" | cut -d ' ' -f 11-15 

cut实用程序可用于在一个时间,以提取多个字段。

或者,如果你想进一步处理数据,您可以用awk:

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

awk工具分割上字边界输入,所以你不必算空格字符。您可以通过$NF和倒数第二个单词$(NF - 1)来达到每行的最后一个单词。

根据您对数据所做的操作,使用perl可能更合适。