【问题标题】:Extract multiple matching substrings from a string using bash script使用 bash 脚本从字符串中提取多个匹配的子字符串
【发布时间】:2020-04-12 14:13:42
【问题描述】:

我想解析 UI 测试日志以提取由 OS Signpost Duration 表示的单个测试的平均持续时间。我已经能够从多个日志文件中提取包含OS Signpost Duration 的行。

/Users/username/Projects/uitest/uitestUITests/uitestUITests.swift:44:测试用例 '-[uitestUITests.uitestUITests test2]' 测量 [OS Signpost Duration (test 2 tapped), s] 平均值:4.001,相对标准偏差:0.017 %,值:[4.001285, 4.000268, 4.002284, 4.000665, 4.001234],performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-test 2 tapped.duration,baselineName:“”,baselineAverage:,maxPercentRegression:10.000%,maxPercentRelativeStandardDeviation: maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/uitestUITests/uitestUITests.swift:33: 测试用例'-[uitestUITests.uitestUITests testExample]' 测量 [OS Signpost Duration (test 1 tapped), s] 平均值: 2.001,相对标准偏差:0.017%,值:[2.001135, 2.001209, 2.000610, 2.000730, 2.000262], performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-test 1 tapped.duration, baselineName: "", baselineAverage: , maxPercentRegression: 10.000 %,最大百分比相对标准偏差:10。 000%, maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/uitestUITests/uitestUITests.swift:54: 测试用例'-[uitestUITests.uitestUITests testLaunchPerformance]' 测量 [OS Signpost Duration (AppLaunch), s] 平均值: 0.463, 相对标准偏差: 12.413%, 值: [0.539167, 0.385542, 0.463822, 0.512382, 0.415148], performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-AppLaunch.duration, baselineName: "", baselineAverage: , maxPercentRegression: 10.00% , maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/uitestUITests/uitestUITests.swift:44: 测试用例 '-[uitestUITests.uitestUITests test2]' 测量 [OS Signpost Duration (test 2 tapped ), s] 平均值:4.001,相对标准偏差:0.018%,值:[4.000617, 4.000975, 4.002513, 4.000692, 4.001549], performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-test 2 tapped.duration, baselineName: "",基线平均: , maxPercentRe gression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/uitestUITests/uitestUITests.swift:33: 测试用例'-[uitestUITests.uitestUITests testExample]' 测量 [OS Signpost Duration (test 1 tapped), s] 平均值: 2.001, 相对标准偏差: 0.020%, values: [2.000350, 2.001232, 2.000362, 2.001022, 2.000259], performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-test 1 tapped.duration, baselineName : "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/uitestUITests/uitestUITests.swift:54: 测试用例'-[uitestUITests.uitestPeriTests testLaunch ]' 测量 [OS Signpost Duration (AppLaunch), s] 平均值:0.416,相对标准偏差:15.702%,值:[0.495147, 0.413174, 0.378256, 0.478277, 0.317015], performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-AppL aunch.duration, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/uitestUITests/uitestUITests.swift:44: 测试用例'- [uitestUITests.uitestUITests test2]' 测量 [OS Signpost Duration (test 2 tapped), s] 平均值:4.002,相对标准偏差:0.010%,值:[4.002300, 4.001725, 4.001849, 4.001945, 4.001093], performanceMetricID:com.apple .dt.XCTMetric_OSSignpost-test 2 tapped.duration, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/uitestUITests/uitestUITests.swift :33: 测试用例 '-[uitestUITests.uitestUITests testExample]' 测量 [OS Signpost Duration (test 1 tapped), s] 平均值:2.000,相对标准偏差:0.020%,值:[2.001171, 2.000079, 2.000173, 2.000237, 2.000132 ],执行manceMetricID:com.apple.dt.XCTMetric_OSSignpost-test 1 tapped.duration, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 /Users/username/Projects/uitest/ uitestUITests/uitestUITests.swift:54: 测试用例 '-[uitestUITests.uitestUITests testLaunchPerformance]' 测量 [OS Signpost Duration (AppLaunch), s] 平均值:0.598,相对标准偏差:31.034%,值:[0.888853, 0.613004, 0.690106, 0.402929,0.395714],performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-AppLaunch.duration,baselineName:“”,baselineAverage:,maxPercentRegression:10.000%,maxPercentRelativeStandardDeviation:10.000%,maxRegression:0.000,maxStandardDeviation:0.000

结果是多个匹配行的组合文本。 现在,如果你注意到上面的文字,你可以看到类似的数据

  1. [OS 路标持续时间(已点击测试 2),s] 平均:4.001
  2. [OS 路标持续时间(已点击测试 1),s] 平均:2.001
  3. [OS Signpost Duration (AppLaunch), s] 平均:0.463

现在我想做的是,提取一些像字典(或哈希图)一样迭代的东西(忽略重复项)

[ “测试 2”:4.001, “测试 1”:2.001, “应用启动”:0.463 ]

我想这样提取,以便我可以迭代变量并将此数据发送到 API。 任何帮助,将不胜感激 ???? 谢谢你:)

【问题讨论】:

    标签: regex bash shell awk sed


    【解决方案1】:

    您可能想创建一个小脚本:

    #!/bin/bash
    
    FILE_PATH='/tmp/tmp'
    
    parsed_data=`\
        sed -e 's/\(\/[^:/]*\)*:[0-9]*:/\n/g' $FILE_PATH | \
        sed -e 's/^.*Duration (\(.*\)).*average: \([0-9.]\+\).*$/\2 \1/g' -e '/^$/d'
    `
    
    while read avg name; do
        printf "name: $name\tavg: $avg\n"
    done <<< $parsed_data
    

    说明

    第一个 sed 仅用于将输入分成几行,每行只有 1 个结果:
    * \(\/[^:/]*\)* ➤ 这会捕获一个路径(例如“/User/My/Path/foo.sh”):
    + \/ 是一个单斜杠(例如/
    + [^:/]* 是不包含斜杠或冒号的任何内容(例如 User
    + \(...\)* 用于捕获组并尽可能多地重复
    * :[0-9]*: ➤ 这匹配行号,出现在路径之后(例如“:44:”)
    * \n ➤ 然后我们用换行符替换所有内容

    所以最后,这会将输入拆分为每个文件名

    附加操作(/^$/d)用于删除空行


    第二个sed 隔离了我们感兴趣的部分:

    • ^.*Duration ➤ 从行首到“持续时间”的任何内容
    • (\(.*\)) ➤ 括号内包含的任何字符串(这是我们的标题)。请注意,我们捕获模式(使用转义大括号 - \(...\)
    • .*average: ➤ 一切都达到“平均”:
    • \([0-9.]\+\) ➤ 任何数字 ([0-9]) 或点 (.)。请注意,我们还捕获了这部分:这是我们的平均值。
    • .*$ ➤ 直到行尾的所有内容

    所以在这一点上,我们匹配了整行,并且我们捕获了标题和平均值。


    现在我们只需要用捕获的组替换所有这些:
    - \2 \1 ➤ 这表示数字 (\2) 和标题 (\1)。

    我们把平均值放在首位,这样更容易阅读(因为标题可能有多个单词......)

    所以在这一点上,我们有一个看起来像这样的字符串:

    12.2345 My small title
    15.2345 My loong long title
    62.2345 My title
    

    那么我们只需要在每一行调用 read:

    read avg name
    

    这里的read 将第一个单词(即平均值)存储在avg 变量中,其余部分(标题)存储在name 变量中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      相关资源
      最近更新 更多