Предполагая, что 'Bulgari'
является примером категории, которую вы хотите извлечь, попробуйте
sed -n "s/.*ERROR.*\] Category '\([^']*\)'.*/\1/p" file.log |
sort | uniq -c | sort -rn | head -n 10
Команда sed
находит строки, которые соответствуют довольно сложному регулярному выражению, и захватывает часть строки, затемзаменяет совпадение захваченной подстрокой и печатает ее (опция -n
отключает действие печати по умолчанию, поэтому мы печатаем только извлеченные строки).Остальное в основном идентично тому, что у вас уже было.
В регулярном выражении мы ищем (начало строки, за которым следует) все (кроме новой строки), за которым следует ERROR
, а затем - ] Category '
и затем строка, которая не содержит ни одной кавычки, затем закрывающая одинарная кавычка, за которой следует что-нибудь.Много «что-нибудь (кроме новой строки)» требуется для того, чтобы заменить всю строку только захваченной строкой внутри одинарных кавычек.Скобки с обратной косой чертой - это то, что фиксирует выражение;Google для "backref" для полного совка.
Ваша первоначальная попытка будет только извлечь фактические ERROR
строки, потому что вы заменили все окружающие пробелы с новыми строками (предполагая, что ваш sed
принимает Perl \s
сокращение, которое не является стандартным в sed
, и что \n
интерпретируется как буквальный перевод строки в замене, которая также не является полностью стандартной или переносимой).