我想分析日志文件,但在这种情况下仍然存在:
实施例: 我有一个格式如下的文件:
140508 0:00:19 10 abc def
9 djdj djdjd
12 fjfj fjfjj
140508 0:00:24 10 dhdh dhdh
19 dddh hdhdhd
1838 jcjj ddhfhfh
17 fhfhh fhfhfh
140508 0:00:29 10 ababa cbcbc
字段分隔符为140508(YYMMDD)。
我想根据字段分隔符输出每个段落中的行数:
140508 0:00:19 3
140508 0:00:24 4
140508 0:00:29 1
感谢。
答案 0 :(得分:3)
使用awk:
awk '/^[0-9]{6} /{if (c) print a, b, c; a=$1; b=$2; c=1; next} {c++} END{print a, b, c}' file
140508 0:00:19 3
140508 0:00:24 4
140508 0:00:29 1
答案 1 :(得分:1)
使用awk
awk '/:/{h=$1 FS $2}{a[h]++}END{for (i in a) print i,a[i]}' file
/:/{h=$1 FS $2}
,仅在:
行上工作,并生成数组a的索引。{a[h]++}
总结该指数的时间。{for (i in a) print i,a[i]}
浏览数组a并执行打印作业。答案 2 :(得分:1)
使用GNU awk
:
awk --re-interval -v RS='(^|\n)[0-9]{6} ' \
'$0=="" {sep=RT; next} {print sep $1, 1+gsub("\n.",""); sep=substr(RT,2)}' file
注意:如果您的gawk
版本为> = 4.0
,则不需要--re-interval
选项。
说明:
[0-9]{6}
用作记录分隔符(RS
),它自动将输入拆分为所需的段落;在它前面加(^|\n)
可确保只在行的开头执行匹配。RT
包含与RS
正则表达式匹配的文字记录终结符;它保存在sep
变量中,用于处理 next 记录。
$0==""
模式和相关操作。\n
,这是substr()
调用所做的。1+gsub("\n.","")
是一个小技巧,实际上只是计算记录中非空行的数量(gsub()
返回替换次数)。