【问题标题】:Shell scripting - how to properly parse output, learning examples.Shell 脚本 - 如何正确解析输出,学习示例。
【发布时间】:2012-02-13 23:32:43
【问题描述】:

所以我想使用 shell 脚本自动执行手动任务,但我对如何解析一些命令的输出有点迷茫。我可以用其他语言毫无问题地做到这一点,所以我将在伪代码中解释我要做什么,并提供一个我试图解析的 cmd 输出示例。

输出示例:

2012 年 2 月 13 日由 user1234@filename '提交的描述'修改 2167467

我需要解析的是“2167467”。所以我想要做的是分割空格并将元素 1 用于另一个命令。我的下一个命令的输出如下所示:

在 2012/02/13 18:10:15 将 2167463 更改为 user1234@filename

   description of submission

受影响的文件...

... //filepath/dir1/dir2/dir3/filename#2298 编辑

我需要解析出 '//filepath/dir1/dir2/dir3/filename#2298' 并在另一个命令中使用它。同样,我要做的是从输出中删除空白行,抓住第 4 行,然后在空间上拆分。从那里我会从拆分中获取第一个元素并在我的下一个命令中使用它。

如何在 shell 脚本中做到这一点?示例或指向一些教程会很棒。

【问题讨论】:

    标签: shell scripting ksh


    【解决方案1】:

    不清楚是否要使用第一个命令的结果来处理第二个命令。如果是真的,那么

    targString=$( cmd1 | awk '{print $2}')
    command2 | sed -n "/${targString}/{n;n;n;s@.*[/][/]@//@;p;}"
    

    您的示例数据中有 2 个不同的 Chg 值(2167467、2167463),因此如果您只想以两种不同的方式处理此输出,则更简单

    cmd1 | awk '{print $2}'
    cmd2 | sed -n '/Change/{n;n;n;s@.*[/][/]@//@;p;}'
    

    我希望这会有所帮助。

    【讨论】:

    • 所有的想法都很好,但这个最有帮助。我最终找到了 xargs,使用了这个,它完美地工作:<my cmd> | awk '{print $2}' | xargs <my second cmd> | grep '^\.\.\.' | awk '{print $2}'
    【解决方案2】:

    我不是 100% 清楚你的问题,但我会使用 awk。

    http://www.cyberciti.biz/faq/bash-scripting-using-awk/

    【讨论】:

      【解决方案3】:

      你的第一个变量看起来像这样

      temp="Chg 2167467 on 2012/02/13 by user1234@filename 'description of submission'"
      

      要获取您想要的号码,请执行以下操作:

      temp=`echo $temp | cut -f2 -d" "`
      

      让第二个命令的输出保存到类似这样的文件中

      command $temp > file.txt
      

      要从文件中得到你想要的,你可以运行这个:

      temp=`tail -1 file.txt | cut -f2 -d" "`
      rm file.txt
      

      最后一段代码获取文件的最后一个非空白行,并在第二组空白处定界

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 2012-03-15
        • 1970-01-01
        相关资源
        最近更新 更多