【问题标题】:Bash script that analyzes report files分析报告文件的 Bash 脚本
【发布时间】:2010-12-14 19:57:52
【问题描述】:

我有以下 bash 脚本,我将使用它来分析当前目录中的所有报告文件:

#!/bin/bash    


# methods
analyzeStructuralErrors()
{ 
    # do something with $1
}

# main
reportFiles=`find $PWD -name "*_report*.txt"`; 
for f in $reportFiles
do
    echo "Processing $f"
    analyzeStructuralErrors $f
done

我的报告文件格式如下:

Error Code for Issue X - Description Text - Number of errors.
col1_name,col2_name,col3_name,col4_name,col5_name,col6_name
   1143-1-1411-247-1-72953-1
   1143-2-1411-247-436-72953-1
   2211-1-1888-204-442-22222-1
Error Code for Issue Y - Description Text - Number of errors.
col1_name,col2_name,col3_name,col4_name,col5_name,col6_name
   Other data
   .
   .
   .

我正在寻找一种方法来检查每个文件并汇总报告数据。在上面的示例中,我们有两个 X 类型的独特问题,我想在 analyzeStructural 中处理它们。在此例程中可以忽略其他类型的问题。任何人都可以就如何做到这一点提供建议吗?我想读取每一行,直到基本上遇到下一个错误,然后将该数据放入某种数据结构中。

【问题讨论】:

  • 我看到一期“X”型和一期“Y”型,而不是两期“X”型。另外,请提供您想用每种错误类型解析出的确切内容。
  • X 型的两期分别是 1143 和 2211。
  • 旁注:避免使用“for FILE in ...; do”来遍历文件,检查“find ... | while IFS=$'\n' read -r FILE; do”或类似。
  • @tokland:除非你可以使用 globbing:for file in *

标签: bash reporting


【解决方案1】:

下面是一个使用它的伪多维数组的工作 awk 实现。我已经包含了示例输出来向您展示它的外观。我冒昧地添加了一个“计数”列来表示给定错误代码的某个“问题”被点击了多少次

#!/bin/bash

awk '
 /Error Code for Issue/ {
   errCode[currCode=$5]=$5
 }
 /^ +[0-9-]+$/ {
   split($0, tmpArr, "-")
   error[errCode[currCode],tmpArr[1]]++
 }
 END {
   for (code in errCode) {
     printf("Error Code: %s\n", code)
     for (item in error) {
       split(item, subscr, SUBSEP)
       if (subscr[1] == code) {
         printf("\tIssue: %s\tCount: %s\n", subscr[2], error[item])
       }
     }
   }
 }
' *_report*.txt

输出

$ ./report.awk
Error Code: B
        Issue:    1212  Count: 3
Error Code: X
        Issue:    2211  Count: 1
        Issue:    1143  Count: 2
Error Code: Y
        Issue:    2961  Count: 1
        Issue:    6666  Count: 1
        Issue:    5555  Count: 2
        Issue:    5911  Count: 1
        Issue:    4949  Count: 1
Error Code: Z
        Issue:    2222  Count: 1
        Issue:    1111  Count: 1
        Issue:    2323  Count: 2
        Issue:    3333  Count: 1
        Issue:    1212  Count: 1

【讨论】:

  • 不错的 SiegeX!我最终用 Java 编写了一个工具。
【解决方案2】:

按照 Dave Jarvis 的建议,awk 将:

  • bash处理得更好
  • 相当容易学习
  • 在 bash 可用的任何地方都可能可用

我从来没有比The AWK Manual 看得更远。

如果您对列名列表和数据使用一致的字段分隔符,事情会变得更容易。也许你可以在bash 脚本中使用sed 进行一些预处理,然后再提供给awk。无论如何,看看手册中的multi-dimensional arraysreading multiple lines

【讨论】:

    【解决方案3】:

    Bash 具有由整数索引的一维数组。 Bash 4 添加了关联数组。数据结构就是这样。 AWK 具有一维关联数组,并通过二维数组伪造它的方式。如果您需要某种比这更高级的数据结构,则需要使用 Python,例如,或其他一些语言。

    也就是说,这里是您如何解析所显示数据的粗略概述。

    #!/bin/bash    
    
    # methods
    analyzeStructuralErrors()
    { 
        local f=$1
        local Xpat="Error Code for Issue X"
        local notXpat="Error Code for Issue [^X]"
        while read -r line
        do
            if [[ $line =~ $Xpat ]]
            then
                flag=true
            elif [[ $line =~ $notXpat ]]
            then
                flag=false
            elif $flag && [[ $line =~ , ]]
            then
                # columns could be overwritten if there are more than one X section
                IFS=, read -ra columns <<< "$line"
            elif $flag && [[ $line =~ - ]]
            then
                issues+=(line)
            else
                echo "unrecognized data line"
                echo "$line"
            fi
        done
    
        for issue in ${issues[@]}
        do
            IFS=- read -ra array <<< "$line"
            # do something with ${array[0]}, ${array[1]}, etc.
            # or iterate
            for field in ${array[@]}
            do
                # do something with $field
            done
        done
    }
    
    # main
    find . -name "*_report*.txt" | while read -r f
    do
        echo "Processing $f"
        analyzeStructuralErrors "$f"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2021-02-04
      • 2020-02-09
      • 1970-01-01
      • 2013-08-30
      • 2018-05-09
      • 2011-04-29
      相关资源
      最近更新 更多