Я столкнулся с проблемой, когда gawk
печатает нежелательный результат. Я хочу найти строки в файле, которые соответствуют выражению, проверить, соответствует ли информация в строке определенному условию, а затем распечатать строку, если это произойдет. Я получаю вывод, который я хочу, но gawk
также печатает каждую строку, которая соответствует выражению, а не только строки, соответствующие условиям.gawk - подавление вывода согласованных строк
Я пытаюсь найти файлы, содержащие даты и время для выполнения определенных действий. Я хочу показать только строки, которые содержат время в будущем. Даты форматируются так:
text... 2016-01-22 10:03:41 more text...
Я попытался с помощью sed
просто напечатать все строки, начинающиеся с тех, которые имели текущий час, но нет никакой гарантии, что файл содержит строку с тем часом, (плюс есть не гарантирует, что все линии имеют определенный год, месяц, день и т. д.), поэтому мне нужно было что-то более надежное. Я решил попытаться преобразовать время в секундах с эпохи и сравнить это с текущим systime
. Если преобразование приводит к числу, превышающему systime
, я хочу напечатать эту строку.
Прямо сейчас, похоже, gawk
's mktime()
Функция является ключом к этому. К сожалению, это требует ввода в следующем формате:
yyyy mm dd hh mm ss
Я в настоящее время поиски тестовый файл (называемый timecomp
) для регулярного выражения, соответствующего формата даты.
Редактировать: тестовый файл содержит только дату и время на каждой строке, никакого другого текста.
Я использовал sed
для замены разделителей (т.е. /, -, и :) с пространством, а затем поступает на выход в поглазеть сценарий под названием stime
с помощью следующего оператора:
sed -e 's/[-://_]/ /g' timecomp | gawk -f stime
Вот сценарий
# stime
BEGIN { tsec=systime(); } /.*20[1-9][0-9] [0-1][1-9] [0-3][0-9] [0-2][0-9][0-6][0-9] [0-6][0-9]/ {
if (tsec < mktime($0))
print "\t" $0 # the tab is just to differentiate the desired output from the other lines that are being printed.
} $1
Сейчас это становится основной информации, которую я хочу, но это также печать каждый, как, что соответствует исходному выражению, а не только строки, содержащие время в будущем. Выход образца:
2016 01 22 13 23 20
2016 01 22 14 56 57
2016 01 22 15 46 46
2016 01 22 16 32 30
2016 01 22 18 56 23
2016 01 22 18 56 23
2016 01 22 22 22 28
2016 01 22 22 22 28
2016 01 22 23 41 06
2016 01 22 23 41 06
2016 01 22 20 32 33
Как напечатать только строки в будущем?
Примечание: Я делаю это на Mac, но я хочу, чтобы он был переносимым для Linux, потому что я в конечном итоге делаю это для выполнения некоторых задач, которые я должен выполнять на работе.
Я хотел бы попытаться выполнить это в одном скрипте, а не требовать, чтобы заявление sed
изменило даты, но я столкнулся с другими проблемами, которые, вероятно, требуют другого вопроса, поэтому я придерживаюсь этого на данный момент ,
Любая помощь была бы принята с благодарностью! Благодаря!
Ответил: У меня был $1
в последней строке моего сценария, и это было причиной дополнительного выхода.
Что такое $ 1 в конце? –
Ваш файл не содержит * any * of ':: _ _ вне даты? Потому что на данный момент вы заменяете их глобально пробелами. Кроме того, почему вы заменяете '/' и '_'? Они не являются частью строки даты. –
'$ 0' по-прежнему является полной записью, включая' text' и 'more text'; разве вы не хотите, чтобы 'mktime' получал только дату/время в качестве аргументов? –