Как очистить файл журнала, чтобы отображались последовательные повторяющиеся строки только один раз с числом, указывающим, сколько раз повторяется эта строка?

- name: tasks replace
  replace:
    regexp: '^(.*\.)@@(.*)$'
    replace: '\1$$\2'
1
08.05.2021, 01:21
4 ответа

Нет необходимости в 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
6
28.07.2021, 11:33

Используя утилиту 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

Примечания:-

  • При условии отсутствия начальных пробелов/следующих пробелов.
1
28.07.2021, 11:33

Если вас устраивает счет в начале строки, 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 )и :

.
  • удаляет начальные пробелы с каждой строки
  • перемещает все цифры в начале каждой строки в конец строки, заключенные в круглые скобки
  • удаляет «(1 )» с конца каждой строки, если она есть.
2
28.07.2021, 11:33

команда

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 
1
28.07.2021, 11:33

Теги

Похожие вопросы