2014-11-30 5 views
1

Например, у меня есть файл log.txt, содержание может бытьПодсчитайте вхождения подстроки в целом Файл

GetData() starts     2014-11-30 17:05 
GetData(100) ends    2014-11-30 17:05  
printf("") starts    2014-11-30 17:05 
printf() ends     2014-11-30 17:06 
UpdateScreen(xxx) starts   2014-11-30 17:06 
UpdateScreen(xx) end    2014-11-30 17:06 
GetData() starts     2014-11-30 17:06 
GetData(100) ends    2014-11-30 17:06 

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

output: 
GetData: 4 
Printf: 2 
UpdateScreen: 2 

Как это сделать с помощью команд командной оболочки linux, таких как awk?

Обновление
Текст() представляют собой параметры, передаваемые в функцию, таким образом, они являются динамическими, что означает, вызовы одному и тому же GetData может оставить различные журналы, такие как GetData (5) заканчивается, или GetData (100) или GetData (1000). Это также одно и то же для других функций.

Я хочу получить общее количество каждой функции, поэтому GetData (2) и GetData (100) будут считаться одним и тем же типом GetData.

ответ

3

Как о чем-то вроде

$ awk -F"(" '{count[$1]++} END{for (i in count) print i": "count[i]}' input 
UpdateScreen: 2 
GetData: 4 
printf: 2 

Что он делает?

  • -F"(" устанавливает разделитель полей в качестве (

  • count[$1]++ Creats массив count индексированный по колонке 1, $1 имя функции

  • for (i in count) print i": "count[i]} печатает содержимое массива

+0

Я хочу получить подстроку (например FunctionName + «(») от $ 1 и получить его вхождения, как добиться, что причины? это: «Текст in() является динамическим, что означает, что вызовы одного и того же GetData могут оставлять разные журналы, такие как GetData (5), или GetData (100) или GetData (1000). Это также то же самое для других функций . " – Steve

+0

@Steve вы хотите получить отдельные подсчеты для GetData (5) GetData (100) и так далее или один счет для всего GetData – nu11p01n73R

+0

Я хочу получить единственный счет для GetData и всех других функций, поэтому мне нужно разделить имя функции от $ 1 и поиск по всему файлу, за исключением использования $ 1 напрямую. Как это сделать? – Steve

0
grep -oP '^\w+' input | sort | uniq -c | sort -nr > output.txt 
  1. Grep ... - Получает имена функций
  2. рода | уник -c - подсчитывает вхождения
  3. рода -nr - порядок их вхождения
Смежные вопросы