解析提交日志
Parse commitlog
我有一个构建多个项目的特定脚本,每次构建后它都会输出提交日志,因此,在一个 运行 之后它可能看起来像这样:
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
这是一个不够优雅的答案,可能无法完全回答您的问题。但也许它可以将您推向正确的方向。
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!=) print "\n"" ""\n--------"; if() print ; old = }'
项目顺序不对
awk '/project_/{proj=[=10=];next}
/----/{next}
{a[proj]=a[proj]"\n"[=10=]}
END{for(i in a){printf("%s\n------------------%s\n",i,a[i])}}' logfile
- 如果行与 project_ 匹配,则将 $0 分配给变量 proj。
- 跳过行匹配 ------。
- 将每个项目的值存储在数组a下,以proj为索引。
- 最后循环遍历数组并显示
不是很优雅,但能胜任:
grep project_ data.txt | sort | uniq | while read p
do
awk -v p="$p" 'BEGIN{print p; print "------------------"}
[=10=]==p {b=1;next} /^$/||/^project_/ {b=0} b>1 {print}
b>0 {b+=1}' data.txt
done
grep sort uniq
提取唯一排序的项目列表。然后将列表传递给 awk
,一次一个项目。 awk
选择相关数据并仅打印一次公共 header,跳过空行。
几乎纯净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
我有一个构建多个项目的特定脚本,每次构建后它都会输出提交日志,因此,在一个 运行 之后它可能看起来像这样:
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
这是一个不够优雅的答案,可能无法完全回答您的问题。但也许它可以将您推向正确的方向。
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!=) print "\n"" ""\n--------"; if() print ; old = }'
项目顺序不对
awk '/project_/{proj=[=10=];next}
/----/{next}
{a[proj]=a[proj]"\n"[=10=]}
END{for(i in a){printf("%s\n------------------%s\n",i,a[i])}}' logfile
- 如果行与 project_ 匹配,则将 $0 分配给变量 proj。
- 跳过行匹配 ------。
- 将每个项目的值存储在数组a下,以proj为索引。
- 最后循环遍历数组并显示
不是很优雅,但能胜任:
grep project_ data.txt | sort | uniq | while read p
do
awk -v p="$p" 'BEGIN{print p; print "------------------"}
[=10=]==p {b=1;next} /^$/||/^project_/ {b=0} b>1 {print}
b>0 {b+=1}' data.txt
done
grep sort uniq
提取唯一排序的项目列表。然后将列表传递给 awk
,一次一个项目。 awk
选择相关数据并仅打印一次公共 header,跳过空行。
几乎纯净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