1

Data从这个 STAF 命令解析部分的最简单方法是什么?
找不到可以传递给命令以自动执行此操作的 STAF 参数,
因此看起来解析/正则表达式可能是最佳选择?
注意:我不想使用任何外部库。

[root@source ~]# STAF target PROCESS START SHELL COMMAND "ls" WAIT RETURNSTDOUT
Response
--------
{
    Return Code: 0
    Key        : <None>
    Files      : [
        {
            Return Code: 0
            Data       : myFile.txt
myFile2.txt
myFile3.txt

        }
    ]
}

相反,我希望输出/结果的格式类似于 ..

[root@source ~]# STAF target PROCESS START SHELL COMMAND "ls" WAIT RETURNSTDOUT
myFile.txt
myFile2.txt
myFile3.txt
4

2 回答 2

1
    Best way to this is Create a XML file and use python script  to access the data part of STAFResult since STAF Return data in Marshalled form as "CONTENT" and python can be use to grab that.

    I will try to explain it with simple example, Its an HTTP request to server. 



 <stafcmd>
    <location>'%s'%machineName</location>
    <service>'http'</service>                   
    <request>'DOGET URL %s?phno=%s&amp;shortCode=%s&amp;query=%s' % (url, phno, shortCode, escapeQuery)</request>
    </stafcmd>
    <if expr="RC == 0">
                <sequence>                      
                    <call function="'func_Script'"></call>
                    <if expr="rc == 0">     <!-- Pass At First Query -->                
                        <sequence>                                                  
                            <message>'PASS@Fisrt HTTPRequest: Keyword = %s,\nRequired Response = %s,\ncontent=%s' %(query, response, content)</message>
                            <tcstatus result="'pass'">'Pass:' </tcstatus>   
                        </sequence>
                    <else>  <!-- Check For MORE -->     
                        <call function="'Validate_QueryMore'"> </call>
                    </else>
                    </if>
                </sequence> 
            <else>
                <message>'ERROR: HTTPRequest QUERY : RC = %s  Result= %s' %(rc,STAFResult)</message>
            </else>                 
            </if>   


<function name="func_Script">
    <script>
        import re
        content = STAFResult['content'].lower() 
        response = response.lower()
        test = content.find(response)
        if test != -1:
            rc = 0 
        else:
            rc = 1 
    </script>
</function>


Hope It will give you some Help.
于 2013-04-05T11:47:25.680 回答
0

您可以通过 sed 脚本通过管道输出命令的输出,该脚本将只为您过滤掉文件名。这是第一个剪辑:

sed -ne '/^[a-z]/p;/Data/s/[^:]*: \(.*\)/\1/p'

这个想法是:如果一行以小写字母开头,那就是一个文件名(表达式直到第一个分号)。如果字符串“Data”在该行中,则取该行中第一个冒号之后的所有内容(分号之后的表达式)。其他一切都被忽略。

您可能希望更具体,而不仅仅是在开头期望一个小写字母(这会过滤掉开头的“响应”行,但如果您的文件名可能以大写字母开头,那将不起作用)。此外,仅查找字符串“Data”可能有点过于笼统——该字符串也可能出现在文件名中。但希望你能明白。要使用它,请像这样运行您的命令:

STAF ... | sed -ne ...
于 2013-03-29T15:58:38.760 回答