我已经使用sed编写了一个小脚本来对此进行转换:
kaefert@Ultrablech ~ $ cat /sys/class/power_supply/BAT0/uevent POWER_SUPPLY_NAME=BAT0 POWER_SUPPLY_STATUS=Full POWER_SUPPLY_PRESENT=1 POWER_SUPPLY_TECHNOLOGY=Li-ion POWER_SUPPLY_CYCLE_COUNT=0 POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7400000 POWER_SUPPLY_VOLTAGE_NOW=8370000 POWER_SUPPLY_POWER_NOW=0 POWER_SUPPLY_ENERGY_FULL_DESIGN=45640000 POWER_SUPPLY_ENERGY_FULL=44541000 POWER_SUPPLY_ENERGY_NOW=44541000 POWER_SUPPLY_MODEL_NAME=UX32-65 POWER_SUPPLY_MANUFACTURER=ASUSTeK POWER_SUPPLY_SERIAL_NUMBER=
变成这样的csv文件格式:
kaefert@Ultrablech ~ $ Documents/Asus\ Zenbook\ UX32VD/power_to_csv.sh "date";"status";"voltage µV";"power µW";"energy full µWh";"energy now µWh" 2012-07-30 11:29:01;"Full";8369000;0;44541000;44541000 2012-07-30 11:29:02;"Full";8369000;0;44541000;44541000 2012-07-30 11:29:04;"Full";8369000;0;44541000;44541000 ... (in a loop)
我现在想将每个数字除以1.000.000,这样它们就不代表µV,而是代表V和W而不是µW,这样一眼便可以轻松理解它们。当然,一旦我在libre office calc中打开此csv之后,便可以手动执行此操作,但是我想使其自动化。
所以我发现,我可以在sed之间调用外部程序,如下所示:
... s/\nPOWER_SUPPLY_PRESENT=1\nPOWER_SUPPLY_TECHNOLOGY=Li-ion\nPOWER_SUPPLY_CYCLE_COUNT=0\nPOWER_SUPPLY_VOLTAGE_MIN_DESIGN=7400000\nPOWER_SUPPLY_VOLTAGE_NOW=\([0-9]\{1,\}\)/";'`echo 0`'\1/
这样我就可以通过以下方式获得所需的值:
echo "scale=6;3094030/1000000" | bc | sed 's/0\{1,\}$//'
但是现在的问题是,如何将匹配项“ \ 1”传递给外部命令?
如果您有兴趣查看完整脚本,可以在以下位置找到它:http : //koega.no- ip.org/mediawiki/index.php/Battery_info_to_csv
如果您的sed是GNU sed。您可以使用“ e”将匹配的组传递给sed命令中的外部命令/工具。
一个例子可能会有助于弄清楚:
例如,您有一个问题: 现在有了一个字符串,"120+20foobar"您想要获得120 + 20部分的计算结果,并将“ foobar”部分中的“ oo”替换为“ xx”。
"120+20foobar"
请注意,此示例并非用于解决上述问题,仅用于显示sed’e’用法
因此您可以120+20在第一个匹配组中创建,在第二个组中休息,然后将两个组传递给不同的命令/工具,然后得到结果。喜欢:
120+20
kent$ echo "100+20foobar"|sed -r 's#([0-9+]*)(.*)#echo \1 \|bc\;echo \2 \| sed "s/oo/xx/g"#ge' 120 fxxbar
这样,您可以将许多sed相互嵌套,直到迷路了。:D