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

348
ino

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

  • Файлы журнала являются текстовыми файлами
  • Есть более 100 разных команд
  • все они начинаются с «Command:», а затем с названия команды.
  • Это одна строка на команду
  • другие строки должны игнорироваться

Поэтому я хотел бы знать, есть ли сценарий или программное обеспечение, которое будет делать это и сортировать результаты по наиболее часто используемым командам, а также отображать частоту каждой команды. Что-то вроде статистики.

(редактировать: я нахожусь на Win XP и у меня нет проблем с установкой программ для этой цели)

0
@ Johannes Win XP, я никогда не использовал PowerShell. отредактировал вопрос. ino 14 лет назад 0

2 ответа на вопрос

2
Joey

С Windows PowerShell вы можете сделать что-то вроде:

Get-Content *.log | Where-Object { $_.StartsWith('Command:') } | Group-Object { $null = $_ -match '^Command: (\w+)'; $Matches[1] } | Select-Object Name,Count 

Для моего тестового файла это дает вывод как

Name Count ---- ----- foo 2 bar 2 baz 1 

Приведенный выше код просто считывает файлы журнала построчно, проталкивая каждую строку по конвейеру, затем фильтрует строки, чтобы использовать только те из них, которые начинаются с «Command:», указывая на команду, которой необходимо следовать. Затем эти строки сгруппированы в отдельные команды. Это делается с помощью регулярного выражения

 ^Command: (\w+) 

которая соответствует строке «Command:» в начале строки, за которой следуют один или несколько символов слова. Это предполагает, что имя команды следует сразу за двоеточием и пробелом; скорректируйте регулярное выражение соответственно, если это не так. Имя команды записывается в группу захвата, которая используется для группировки. После этого выбираются только название и частота команд.

$null =Часть для матча, чтобы подавить вывод -matchоператора, который будет возвращать всегда Trueздесь. Мы не хотим группировать, True barно только по bar.

ETA: В зависимости от того, как точно выглядит ваш ввод, вы можете немного подправить настройки.

  • Разрешить пустые команды:

     ^Command: (\w*) 
  • Разрешить произвольные непробельные символы в именах команд (и пустые команды):

     ^Command: ([^ ]*) 
Это прекрасно работает, но когда «Command:» пусто или начинается со звездочки, выдает ошибку. Кроме этого это идеально. есть идеи на этот счет? ino 14 лет назад 0
@ume: Ну, без подробностей о том, как именно выглядят твои строки, было немного догадок. Чтобы разрешить пустые команды, замените `+` в регулярном выражении на звездочку `*`. Чтобы добавить больше символов, вы можете заменить `\ w` на точку` .`, но это может слишком совпадать ... если пробелы заканчивают имена ваших команд, то вы можете использовать `[^]` (обратите внимание на пробел внутри скобки) в качестве замены `\ w`. Joey 14 лет назад 0
0
squillman

Какая ОС?

Это не идеально соответствует вашим требованиям, но ...

grep -i -c Command *.log 

даст вам количество вхождений с разбивкой по файлам. Затем вы можете проанализировать этот вывод, чтобы получить ваши итоги. Скопируйте его в текстовый файл и перетащите в Excel или еще что-нибудь. Не очень сложно, но, по общему признанию, не полностью автоматизировано. Я часто нахожу, что трачу больше времени на поиск полностью автоматизированного решения, чем на что-то подобное ... Вы можете получить grep для Windows с помощью cygwin .

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