Я не знаю о способе изменить порядок globbing, но существует легкое обходное решение для Вашего случая:
grep squiggle /var/log/messages-* /var/log/messages
т.е. не соответствуйте messages
файлы в Вашем шаблоне шарика, и добавляют его в конец grep
список аргументов.
Поля в awk на значение по умолчанию, разграниченное"", это означает
$1
не содержит пространство, таким образом, корректный regex для $1
:
awk '$1 ~ /^[a-zA-Z0-9]{4}$/ {print}' file
Если Вы хотите сохранить свой исходный подход, можно также просто использовать $0
вместо этого, т.е.:
awk '$0 ~ /^[a-zA-Z0-9]{4}\s/ {print}' file
Для упрощения вещей, можно также использовать \w
вместо того, чтобы явно определить словесные символы, т.е.:
awk '$0 ~ /^\w{4}\s/ {print}' file
Если Вы только хотите соответствовать пространству и не чему-то еще как TAB
просто необходимо заменить \s
с""(без кавычек).
Другой проблемой с Вашим исходным подходом являются недостающие привязки. Поскольку Вы не указывали также ^
ни $
Ваш шаблон может произойти где угодно, т.е. шаблон соответствовал бы для Elizabeth Stachelin
с beth
.
Первое поле $1
, и его длина length($1)
, так:
awk 'length($1) == 4 {print}'
или больше succintly
awk 'length($1) == 4'
То, что Вы записали, не работает по двум причинам. Во-первых, у Вас есть дополнительное " "
в Вашем regexp, таким образом, Вы требуете, чтобы поля содержали двойную кавычку, пространство, двойная кавычка. При фиксации этого Вы добираетесь /[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]/
, который соответствует полю, которое содержит по крайней мере четыре буквы ASCII или цифры, но может содержать больше, таким образом, оно будет соответствовать Elizabeth
а также John
, но нет Tom
. Можно записать /^[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]$/
для привязки regexp в запуске и конце, но если то, что Вы после, является длиной поля, просто пишут это.
В AWK можно использовать регулярное выражение в качестве шаблона как BEGIN
или END
Вы часто видите в сценарии AWK. Упрощенный код может быть похожим
awk '/^[[:alnum:]]{4}\>/'
Это - все, что необходимо встретить, Вам нужно. Вам не нужно действие, {print}
действие по умолчанию, когда башмак соответствовал, который печатает всю запись, т.е. всю строку.
[:alnum:]
синоним к [a-zA-Z0-9]
в основном, в зависимости от локали. Можно также использовать \w
— только это также включает подчеркивание _
, это - стенография [[:alnum:]_]
:
awk '/^\w{4}\>/'
\>
соответствует концу слова. При помощи его можно соответствовать строке как John:(###)...
правильно, если у Вас есть записи, которые не содержат полные имена.
Хотя Вы спрашиваете AWK, но я предложил бы использовать sed
, это работает почти дважды с такой скоростью, как AWK в случае:
sed -n '/^[[:alnum:]]\{4\}\b/p'
\b
\>
или \<
в AWK. Я протестировал на 500K строки, 100K подобранные строки, AWK занял приблизительно 1,7 секунды, sed только занял 0,9 секунды. Но тестовый сценарий является экстремальным значением, это - просто придираться к мелочам предложение.
Я также предположил бы, что Вы читаете man 7 regex
а также man awk
и info awk
.