- name: tasks replace
replace:
regexp: '^(.*\.)@@(.*)$'
replace: '\1$$\2'
Нет необходимости в awk
, просто используйте uniq
напрямую,
uniq -c -f 1 file
Опция -c
дает подсчет количества раз, когда строка была последовательно найдена во входных данных, и вы можете пропустить метку времени в первом поле с разделителями пробелом или табуляцией -с помощью -f 1
.
Пример с данными в вопросе:
$ uniq -c -f 1 file
1 18:56:54 Info: Starting
3 18:56:55 Error: timed out
1 18:56:58 Info: reconnected
1 18:56:59 Error: timed out
Используя утилиту awk , мы можем получить уникальное количество событий следующим образом:
$ awk '
{t=substr($0,1+index($0,FS))}
prev != t {
if (NR>1) {fx(line,knt)}
knt = 0
prev = t
}{
line = $0
knt++
}
END {fx(line,knt)}
function fx(a,b) {
print a (b>1?sprintf("%s(%d)",OFS,b):"")
}
' file
18:56:54 Info: Starting
18:56:57 Error: timed out (3)
18:56:58 Info: reconnected
18:56:59 Error: timed out
Примечания:-
Если вас устраивает счет в начале строки, uniq
— это все, что вам нужно:
$ uniq -f 1 -c log.txt
1 18:56:54 Info: Starting
3 18:56:55 Error: timed out
1 18:56:58 Info: reconnected
1 18:56:59 Error: timed outhet
-f 1
пропускает первое поле, -c
считает строки.
Чтобы получить точный формат, который вы просили, вам нужно обработать вывод uniq
, например. сsed
:
$ uniq -f1 -c log.txt |
sed -E -e 's/^[[:space:]]+//;
s/^([[:digit:]]+)[[:space:]]+(.*)/\2 (\1)/;
s/ \(1\)$//'
18:56:54 Info: Starting
18:56:55 Error: timed out (3)
18:56:58 Info: reconnected
18:56:59 Error: timed out
Сценарий sed использует расширенные регулярные выражения (-E
, параметр ), также известный как ERE, вместо базовых регулярных выражений по умолчанию (, BRE )и :
команда
uniq -f 1 -c filename| awk '{print $2,$3,$4,$5,$1}'| awk '{if($NF > 1){$NF="("$NF")";print }else{$NF="";print }}'
выход
18:56:54 Info: Starting
18:56:55 Error: timed out (3)
18:56:58 Info: reconnected
18:56:59 Error: timed out