Мне нужно проанализировать статистику rsyn c, например:
Number of files: 265 (reg: 189, dir: 10, link: 66)
Number of created files: 18
Number of deleted files: 4
Number of regular files transferred: 24
Total file size: 121.67K bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 9.15K
Total bytes received: 33
sent 9.15K bytes received 33 bytes 18.37K bytes/sec
total size is 121.67K speedup is 13.24
Анализировать каждую строку довольно легко с помощью таких команд:
$(echo "$rawstats" | grep -Po '(?<=Number of files: ).*')
Теперь мне нужно проанализировать первую линия. Я нашел здесь решение Perl: Perl Parse rsyn c Output но я не хочу полагаться на perl, и ответ Дэна Лоу не будет работать во всех случаях, поскольку в () может быть любая комбинация reg :, dir :, link: (и даже другие, которые я игнорирую). Т.е.:
265 (reg: 189, dir: 10, link: 66)
265 (dir: 10, link: 66)
265 (link: 66)
Итак, я пытаюсь создать правильное регулярное выражение для перехода к grep -P Пока что я нашел:
(\d+) \((?:([a-z]+): (\d+)(?:, )?)*\)?
Что соответствует этому:
[0] is a null string
[1]=265
[2]=link
[3]=66
Результат, которого я ожидал:
[1]=265
[2]=reg
[3]=189
[4]=dir
[5]=10
[6]=link
[7]=66
Я не вижу, как улучшить свой результат. Даже лучшим результатом будет ассоциативный массив bash, например:
[reg]=189
[dir]=10
[link]=66
Спасибо за вашу помощь