分析报告文件的Bash脚本
我有以下bash脚本,用于分析当前目录中的所有报告文件:分析报告文件的Bash脚本,bash,reporting,Bash,Reporting,我有以下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 $
#!/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的独特问题,我想在AnalyzeStructure中处理。在此例程中,可以忽略其他类型的问题。有人能就如何做到这一点提供建议吗?我想阅读每一行,直到基本上遇到下一个错误,然后将数据放入某种数据结构中。正如Dave Jarvis所建议的,
awk
将:
- 比bash更好地处理这个问题
- 这很容易学
- 可能在bash可用的任何地方都可用
如果对列名列表和数据都使用一致的字段分隔符,事情会变得更容易。也许您可以在馈送到
awk
之前,使用sed
在bash
脚本中进行一些预处理。无论如何,看看手册中的多维数组
和读取多行
。Bash有一个由整数索引的一维数组。bash4添加了关联数组。数据结构就是这样。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
#/bin/bash
#方法
分析结构错误()
{
本地f=1美元
本地Xpat=“问题X的错误代码”
local notXpat=“问题[^X]的错误代码”
而read-r行
做
如果[$line=~$Xpat]]
然后
flag=true
elif[[$line=~$notXpat]]
然后
flag=false
elif$flag&&[$line=~,]]
然后
#如果有多个X节,则可能会覆盖列
IFS=,read-ra columns下面是一个正在工作的awk实现,它使用它的伪多维数组。我已经包含了示例输出,以向您展示它的外观。我冒昧地添加了一个“Count”列,以表示给定错误代码遇到某个“问题”的次数
#!/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
输出
我看到一个版本的类型为“X”和一个版本的类型为“Y”,而不是两个版本的类型为“X”。另外,请提供您希望对每个错误类型解析的内容。类型为X的两个版本是1143和2211。@Amir:?旁注:避免“for FILE in…
;do”要对文件进行迭代,请选中“find…| while IFS=$”\n“read-r FILE;do”或者类似的。@tokland:除非你能用globbing:在*
Nice-SiegeX中为文件做这件事!我最后用Java写了一个工具。
$ ./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