Выбор даты только столбец в 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)

Однако я предлагаю пересмотреть ваше регулярное выражение, чтобы вывести правильное совпадение для начала.

Другие вопросы по тегам