Как подсчитать количество экземпляров слова, начинающегося с другого слова

Мне нужно grep журнал ошибок MySQL, начиная с сегодняшней даты, отформатированной так:

 `date +"%y%m%d"` (140710) 

И ищите все экземпляры слова, partitioned на partitioned .

Я пробовал разные вещи безрезультатно. Казалось, это сработало:

 more +/"`date +"%y%m%d"`" mysql-error.log | grep -c partitioned 

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

Мне нужно, чтобы он возвращал ноль, если нет записей с сегодняшнего дня, а не grep весь файл и подсчет результатов.

Есть ли лучший способ сделать это, используя sed или awk или что-то еще?


С технической точки зрения, я полагаю, что мне нужно подсчитывать: } partitioned { за ним следует строка альфа-числовых символов}}, потому что порция {(без какой-либо строки)} может произойти и не должна учитываться.

Однако это не строгое требование. Я был бы счастлив просто подсчитывать экземпляры слова partitioned .

Вот пример файла журнала:

 140109 12:25:07 [Note] WSREP: view(view_id(PRIM,c4819ddf-7952-11e3-89fc-4f9f1bfa267f,3) memb { c4819ddf-7952-11e3-89fc-4f9f1bfa267f, } joined { } left { } partitioned { f85c2e70-7952-11e3-a759-aa8332246e85, }) 140109 12:25:07 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 85) 

  • Сценарий мониторинга для сервера redis
  • Точная разница между данными строк в двух файлах в Linux
  • Как выполнить команды Netscaler через удаленную машину через SSH-соединение
  • Перезаписать файл с использованием AWK в цикле for
  • Строка Shebang с `#! / Usr / bin / env command -argument` не работает в Linux
  • Запустить скрипт на нескольких оболочках?
  • Труба к моему собственному сценарию
  • Оценка find (-exec)
  • 2 Solutions collect form web for “Как подсчитать количество экземпляров слова, начинающегося с другого слова”

    С помощью GNU sed anhd grep вы можете попробовать:

     sed -n "/$(date +%y%m%d)/,\$p" file | grep -c partitioned 

    /pattern/,$ сопоставил первый шаблон в конце файла.

    С вашим вводом:

     $ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned 1 

    Без соответствующей даты:

     $ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned 0 

    Вы могли бы попытаться объединить две greps вместе:

     grep `date +"%y%m%d"` mysql-error.log | grep -c partitioned 

    Или даже проще:

     grep -c "`date +%y%m%d`.*partitioned" mysql-error.log 

    РЕДАКТИРОВАТЬ

    Поскольку дата и слово «разделенные» находятся на разных строках, тогда:

     d=$(date +"%y%m%d"); awk '/'$d'/,EOF {print $0}' mysql-error.log | grep -c partitioned 

    Или:

     awk '/'$(date +%y%m%d)'/,EOF {print $0}' mysql-error.log | grep -c partitioned 
    Linux и Unix - лучшая ОС в мире.