解析提交日志

时间:2015-09-15 04:52:58

标签: bash sh

我有一个构建多个项目的脚本,在每次构建之后它会输出一个提交日志,因此,在一次运行后它可能看起来像这样:

project_1 2015-09-09
------------------
a
b
c
d

project_2 2015-09-09
------------------
1
2
3
4

然后在一个小时左右后,它将构建所有已更改的项目,以便文件现在看起来像这样

project_1 2015-09-09
------------------
a
b
c
d

project_2 2015-09-09
------------------
1
2
3
4
project_1 2015-09-09
------------------
a1
b1
c1
d1

project_2 2015-09-09
------------------
11
22
33
44

project_3 2015-09-09
------------------
11a
22a
33a
44a

我想解析文件以将具有相同名称的部分折叠成一个,所以它看起来像这样:

project_1 2015-09-09
------------------
a
b
c
d
a1
b1
c1
d1

project_2 2015-09-09
------------------
1
2
3
4
11
22
33
44

project_3 2015-09-09
------------------
11a
22a
33a
44a

project_1 2015-09-10
------------------
aasd
bddd
cddd
ddd
a1dddd
b1ddd
c1ddd
d1dd

4 个答案:

答案 0 :(得分:1)

这是一个不优雅的答案,可能无法完全回答你的问题。但也许它可以推动你朝着正确的方向发展。

cat logfile |  grep  -Ev "\-{2,}" | while read line;
do 
  new=$(echo $line | grep -Ec [0-9]{4}-[0-9]{2}-[0-9]{2}); 
  if [ $new -ge 1 ]
    then pro=$line; 
  else
    echo $pro $line; 
  fi; 
done | sort -k1,2 | 
awk '{if (old!=$1$2) print "\n"$1" "$2"\n--------"; if($3) print $3; old = $1$2}'

答案 1 :(得分:1)

项目不合规

TooltipHelper
  • 如果行匹配project_,则将$ 0分配给变量proj。
  • 跳过匹配的线------。
  • 将每个项目的值存储在数组a下,并将proj作为索引。
  • 最后,遍历数组并显示

答案 2 :(得分:1)

几乎纯粹的Bash。收集关联数组中的项目行,对键进行排序,并按排序顺序编写项目

declare -A array
declare sep="------------------"

while read line; do
  if [[ $line =~ ^project_ ]] ; then
    key="$line"
  else
    [[ $line =~ ^(---|$) ]] || array[$key]+="$line"$'\n'
  fi
done  < "$infile"

readarray -t idx < <(for a in "${!array[@]}"; do echo "$a"; done | sort -k2 )

for key in "${idx[@]}"; do
  printf "%s\n%s\n%s\n" "$key" "$sep" "${array[$key]}"
done

答案 3 :(得分:0)

不是很优雅,但做的工作:

grep project_ data.txt | sort | uniq | while read p
do
    awk -v p="$p" 'BEGIN{print p; print "------------------"}
        $0==p {b=1;next} /^$/||/^project_/ {b=0} b>1 {print}
        b>0 {b+=1}' data.txt
done

grep sort uniq提取未经统一的排序项目列表。然后将该列表一次传递给awk,一个项目。 awk选择相关数据并仅打印公共标题一次,跳过空行。