Как я могу подсчитать, сколько раз фраза появляется в файле, и аккуратно отформатировать ее?

Можно просто отредактировать /etc/syslog.conf файл и, везде, где /var/adm/messages появляется, копируйте строку и замену /var/adm/messages @remoteSystem с remoteSystem будучи IP-адресом или именем хоста удаленного сервера, куда отправить журналы.

например:

прежде:

...
*.err;kern.debug;daemon.notice;mail.crit    /var/adm/messages
...

после:

...
*.err;kern.debug;daemon.notice;mail.crit    /var/adm/messages
*.err;kern.debug;daemon.notice;mail.crit    @jaylogserver
...

Перезапустите syslogd для изменения, которое будет принято во внимание:

# svcadm restart system-log

Обратите внимание, что удаленный сервер должен быть настроен для принятия удаленных сообщений. Если бы на Солярисе также, который был бы сделан с этой командой:

# svccfg -s system-log setprop config/log_from_remote = true
# svcadm restart system-log
3
28.05.2015, 02:38
2 ответа

Для вашего обновленного вопроса:

awk '
/"rarely_used_module"/ && /OUT:/ { nc[$NF]++ ; c++ }
END {
    printf "Number of license checkouts for rarely_used_module: %d\n", c
    for (i in nc) printf "User: %s (%d)\n", i, nc[i]
}
' logfile.txt

создает этот вывод:

Number of license checkouts for rarely_used_module: 4
User: doej@server.domain (2)
User: smithj@server.domain (2)



Я сохраняю оригинальный ответ ниже, чтобы показать, как расширить код в случае повышения требований.

Вот пример того, как можно подойти к таким задачам, используя awk:

awk '
BEGIN { SUBSEP = ", " ; OFS = ": " }
{ m[$(NF-1)]++ }
{ n[$(NF-1)] = n[$(NF-1)] " " $NF }
{ nc[$(NF-1),$NF]++ }
END {
    print "\n=== count modules:"
    for (i in m) print i, m[i]
    print "\n=== collect names using modules:"
    for (i in n) print i, n[i]
    print "\n=== count names using modules:"
    for (i in nc) print i, nc[i]
}
' logfile.txt

Explanation:

  • { m[$(NF-1)]++ } - счетчик инкрементов для второго последнего поля (модуля) во входных данных
  • { n[$(NF-1)] = n[$(NF-1)] " " $NF } - конкапсулирует последнее поле (имена) для каждого ключа (модуля)
  • { nc[$(NF-1)), $NF]++ } - счетчик инкрементов для ключевого элемента (имя, модуль)

С вашими данными-образец выдаст этот вывод:

=== count modules:
"rarely_used_module": 1
"different_module": 2
"certain_module": 3

=== collect names using modules:
"rarely_used_module":  doej@server.domain
"different_module":  doej@server.domain userg@server.domain
"certain_module":  doej@server.domain smithj@server.domain smithj@server.domain

=== count names using modules:
"different_module", userg@server.domain: 1
"different_module", doej@server.domain: 1
"certain_module", smithj@server.domain: 2
"rarely_used_module", doej@server.domain: 1
"certain_module", doej@server.domain: 1
1
27.01.2020, 21:31

Когда мне нужно что-то более сложное, чем изменение или сопоставление каждой строки, я использую Python, потому что это язык общего назначения. Он может быть более подробным, чем awk (кстати, есть pawk , Python awk), но он также дает вам хорошо документированный и легко расширяемый код.

Вот скрипт Python 2 для вашей задачи:

from collections import defaultdict

FILE = 'module.txt'

# Global table of usages is 
# dict [ module_name ] -> dict [ user_name ] -> count
usage = defaultdict(lambda : defaultdict(int))

# Read, parse data and add usage count where needed
with open(FILE) as f:
    for line in f:
        # Split using spaces and pick last 2 fields, 
        # strip unncessary characters
        fields = line.split()     
        user = fields[-1].rstrip()
        module_name = fields[-2].strip('"')

        usage[module_name][user] += 1

# Now print pretty results
for module_name, module_usage in usage.items():
    print '====> ', module_name
    for user, count in module_usage.items():
        print '\t', user, count

Он напечатает следующие данные для вашего образца:

====>  different_module                                                                                                                                                        
        doej@server.domain 1
        userg@server.domain 1
====>  rarely_used_module
        doej@server.domain 1
====>  certain_module
        smithj@server.domain 2
        doej@server.domain 1
0
27.01.2020, 21:31

Теги

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