使用bash脚本解析文本

时间:2012-06-02 03:10:00

标签: bash parsing

我想构建一个读取文件并生成一些命令行参数的bash脚本。我的输入文件看起来像

20.83      0.05     0.05  __adddf3
20.83      0.10     0.05  __aeabi_fadd
16.67      0.14     0.04  gaussian_smooth
8.33      0.16     0.02   __aeabi_ddiv

我必须检测并复制所有__ *字符串,然后将它们转换为

等命令
gprof -E __adddf3 -E __aeabi_fadd -E __aeabi_ddiv ./nameof.out

到目前为止,我使用

#!/bin/bash
while read line
do
    if [[ "$line" == *__* ]] 
    then
        echo $line;
    fi
done <input.txt

检测所请求的行,但我想,我需要的是一个单行命令的东西,我无法弄清楚。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

修改脚本:

#!/bin/bash
while read -r _ _ _ arg
do
    if [[ $arg == __* ]] 
    then
        args+=("-E" "$arg")
    fi
done <input.txt
gprof "${args[@]}" ./nameof.out

下划线是有效的变量名称,用于丢弃您不需要的字段。

最后一行使用参数执行命令。

您可以使用进程替换将另一个命令的结果提供到while循环中:

#!/bin/bash
while read -r _ _ _ arg
do
    if [[ $arg == __* ]] 
    then
        args+=("-E" "$arg")
    fi
done < <(gprof some arguments filename)
gprof "${args[@]}" ./nameof.out

答案 1 :(得分:3)

给猫皮肤的另一种方法:

gprof `sed -ne '/__/s/.* / -E /p' input.txt` ./nameof.out

sed脚本使用__搜索行,然后使用-E将所有内容更改为最后一个空格并打印结果。如果你的空格可能包含标签,你可能需要稍微调整一下。为清楚起见,我在这里没有考虑到这一点。

答案 2 :(得分:2)

使用awk

awk '$4 ~/^__/{a=a" -E "$4}END{system("gprof "a" ./nameof.out")}' inputFile