GREP исключает первые 11 значений

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

т.е. из этого:

 Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0 Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack; Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.225:is_dns_hijack:1425:isDnsHijack=0 Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.048:cmsLck_acquireLockWithTimeoutTraced:95:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.048:cmsLck_releaseLockTraced:141:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack; Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.049:is_dns_hijack:1451:isDnsHijack=0 

к этому :

 Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0 Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack; 

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

Я пытался использовать uniq но для этого мне нужно удалить отметку времени в третьем столбце (достижимая с awk '{ $3=""; print }' ), но, как вы можете видеть из журнала, первые 11 символы различны (т.е. ssk:563.048ssk:563.049 ). Я думал о том, чтобы сделать grep со словом dns и попытаться игнорировать первые 11 значений.

Как я могу это сделать? Есть ли способ лучше?

  • Чтение файла журнала между двумя датами
  • Как использовать grep, когда файл не содержит строку
  • Как я могу учить grep для обработки свойств-файлов, таких как текстовые файлы
  • Развертывание одной строки на две строки на основе определенных столбцов
  • Есть ли глобальный grep.conf в Unix / Linux?
  • Рекурсивный grep, совместимый с POSIX, без ошибок для недоступных каталогов
  • список выбираемых единиц для журнала
  • Удаление строк в текстовом файле LARGE, содержащем строку, найденную в другом текстовом файле LARGE - FILES SORTED
  • One Solution collect form web for “GREP исключает первые 11 значений”

    Используйте awk и : как разделитель полей. Затем вы можете сохранить каждое уникальное сообщение об ошибке (которое будет 6-м полем) в массиве и напечатать только первое вхождение:

     $ awk -F: '!a[$6]++' file Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0 Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack; Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds 

    Сценарий выше сохранит каждую строку как запись в ассоциативном массиве a только если для 6-го поля ( !a[$6] ) уже не сохранено значение. Поскольку действие по умолчанию в awk должно печатать, когда что-то оценивает значение true, это приведет к печати только первых уникальных вхождений.

    Если вы хотите сделать это только для строк, соответствующих dns , используйте:

     awk -F: '!a[$6]++ && /dns/' file 

    Что касается игнорирования 1-го 11 строк, вы можете сделать это с помощью:

     grep dns file | tail -n +12 
    Interesting Posts

    присвоение переменной environement, за которой следует команда

    bash completion: как заполнить список хостов для определенного аргумента?

    Что именно происходит, когда я выполняю apt-get upgrade?

    Приложение для заметок, которое может синхронизировать как Android, так и Linux

    Почему я должен избегать циклов в оболочках?

    Разрешить чтение файла только командой системы в программе C

    Отправлять / получать монитор полосы пропускания для каждого приложения?

    Как обеспечить, чтобы только один экземпляр моего сценария ksh выполнялся на Solaris с помощью NFS?

    Короткий путь к scp с использованием одного и того же файла / источника в исходном и целевом

    Получение полной командной строки, вызвавшей ERR, в то время как ловушка

    различия между командами echo ">> и>

    Использование grep с шаблоном, который содержит переменную, подлежащую расширению

    Каков эффект установки значения тайм-аута на 0 в файле /etc/resolv.conf?

    Как определить уровень TMux

    Bash для преобразования всех * flac в * .mp3 с FFmpeg?

    Linux и Unix - лучшая ОС в мире.