Ваше регулярное выражение задает фиксированную ширину символа для строк переменной ширины.Исходя из ваших примеров, что-то вроде
[0-9]\+\.[A-Z0-9]\+
может показаться лучшим выражением.Однако, возможно, мы могли бы также упростить это, объединив команды cut
и несколько grep
в один скрипт Awk.
find etc etc -exec awk -F '|' '
$4 ~ /Category is not found for local configuration\/code\/[0-9]{3}\.[0-9A-Z]/ {
split($4, a, /\/code\/);
split(a[2], b); print b[1] }' {} + |
sort -u
Две операции split
- это всего лишь дешевый способ выбратьтекст между /code/
и следующим пробельным символом;с помощью соответствия регулярному выражению мы уже установили, что строка после /code/
соответствует шаблону, который нам нужен.
Обратите также внимание на то, что sort
имеет опцию -u
, которая позволяет заменить (тривиальнопадежи) uniq
.
Вариант регулярного выражения, поддерживаемый Awk, немного отличается от варианта, поддерживаемого POSIX grep
;поэтому обратный слэш \+
в диалекте BRE grep
является простым +
в диалекте, называемом ERE, который [более или менее] поддерживается Awk - и grep -E
.Если у вас есть grep -P
, вы можете использовать третий вариант, который имеет удобную функцию;
find etc etc -exec grep -oP '^([^|]*[|]){3}[^|]*Category is not found for local configuration/code/\K[0-9]{3}\.[0-9A-Z]+' {} + |
sort -u
\K
говорит: «Подойди сюда, но забудь все до этого» и печатает только частьпосле этого токена.