Выбор даты только столбец в awk
У меня есть этот кусок кода:
{
if ($4 ~search)
{
match ($4, /([0-9]{2}\/([a-zA-z]{3})\/([0-9]{4}))/, dates)
print dates[1] "\t" dates[2] "\t" dates[3]
}
}
и когда он запускается, он производит это:
[19/Oct/2012:12:34:32
[19/Oct/2012:12:34:32
[19/Oct/2012:12:34:33
Так что в теории это работает и производит то, что я хочу, но как мне заставить его просто производить 19/Oct/2012
какие-либо предложения?
Мои вопросы: я бы хотел, чтобы на выходе была только дата 19/2012/2012?
2 ответа
Вам нужно исправить свое регулярное выражение:
{
match ($4,/[0-9]{2}\/[a-zA-z]{3}\/[0-9]{4}/,date)
print date[0]
}
Будет выводить:
19/Oct/2012
19/Oct/2012
19/Oct/2012
Заметки:
Ваш текущий
regexp
ищет даты с числовым месяцем, например19/10/2012
не19/Oct/2012
,Ваши группы захвата пропущены (несбалансированные скобки).
В приведенном вами примере год
20012
не2012
!?Вы идете из
dates
вdate
,date[0]
хранит весь матч, покаdate[n]
относится к n-й группе захвата.
Может быть, лучший подход к вашей общей проблеме, но невозможно сказать с очень малой (и очень ошибочной) предоставленной информацией.
Редактировать:
Единственные проблемы, которые, похоже, остались, это неуместная группа захвата.
{
match ($4, /([0-9]{2})\/([a-zA-z]{3})\/([0-9]{4})/, dates)
print dates[1] "\t" dates[2] "\t" dates[3]
}
Будет выводить:
19 Oct 2012
19 Oct 2012
19 Oct 2012
Но в своем вопросе вы заявляете, что хотите вывод в формате 19/Oct/2012
(что и делает мое первое предложение)!?
Игнорирование ошибок в вашем образце кода и выводе, если все, что вы хотите сделать, это удалить ведущие [
тогда вы могли бы просто substr
матч начинается со 2-го символа:
print substr(date[0], 2)
Однако я предлагаю пересмотреть ваше регулярное выражение, чтобы вывести правильное совпадение для начала.