Строки печати, где первое поле имеет только четыре символа с помощью regex в awk?

Я не знаю о способе изменить порядок globbing, но существует легкое обходное решение для Вашего случая:

grep squiggle /var/log/messages-* /var/log/messages

т.е. не соответствуйте messages файлы в Вашем шаблоне шарика, и добавляют его в конец grepсписок аргументов.

3
24.11.2012, 09:18
3 ответа

Поля в 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.

6
27.01.2020, 21:10

Первое поле $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 в запуске и конце, но если то, что Вы после, является длиной поля, просто пишут это.

1
27.01.2020, 21:10

В 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.

3
27.01.2020, 21:10

Теги

Похожие вопросы