Как получить текущую дату и время и добавить в конце каждой строки, содержащей "Hello"
У меня есть следующий файл party.txt
, который содержит что-то вроде следующего:
Hello Jacky
Hello Peter
Bye Johnson
Hello Willy
Bye Johnny
Hello Mary
Hello Wendy
Я использовал grep hello
для захвата содержимого, но когда я использую print date +"%Y-%m-%d'
и добавляю к нему, я не могу, и я получу много 0
на строку.
cat party.txt | grep Hello | awk '{ print date +"%Y-%m-%d"}'
Чего мне не хватает?
Ответы
Ответ 1
Один способ, используя awk
:
awk -v date="$(date +"%Y-%m-%d %r")" '/Hello/ { print $0, date}' party.txt
Результаты:
Hello Jacky 2012-09-11 07:55:51 PM
Hello Peter 2012-09-11 07:55:51 PM
Hello Willy 2012-09-11 07:55:51 PM
Hello Mary 2012-09-11 07:55:51 PM
Hello Wendy 2012-09-11 07:55:51 PM
Обратите внимание, что значение даты устанавливается только при запуске awk
, поэтому оно не изменится, даже если выполнение команды занимает много времени.
Ответ 2
gawk (и последние версии mawk) имеют встроенную функцию времени/даты, поэтому нет необходимости использовать внешние инструменты.
gawk '/Hello/{print NR " - " $0 " - " strftime("%Y-%m-%d")}' party.txt
Ответ 3
awk 'BEGIN{"date +'%Y-%m-%d'"|getline d;}/Hello/{print $0,d}' file
предоставит вам:
Hello Jacky 2012-09-11
Hello Peter 2012-09-11
Hello Willy 2012-09-11
Hello Mary 2012-09-11
Hello Wendy 2012-09-11
Ответ 4
Это решение должно работать с любым awk:
awk '/Hello/ {cmd="(date +'%H:%M:%S')"; cmd | getline d; print d,$0; close(cmd)}' party.txt
Магия происходит в инструкции close(cmd)
. Он заставляет awk
выполнять cmd
каждый раз, поэтому дата будет действительной каждый раз.
cmd | get line d
считывает вывод из cmd
и сохраняет его на d
.
Ответ 5
Чтобы ответить на прямой вопрос, вам не хватает того, что date
является внешней командой, поэтому вам нужно либо вызывать ее вне awk, либо передавать ее как переменную (как показывает один из других ответов), или вызывать его из awk как системную команду либо с помощью встроенного или тэга system()
(как показывает другой один из других ответов).
Причина, по которой вы видите 0
, состоит в том, что выражение date +"%Y-%m-%d"
интерпретируется как добавление числового значения переменной date
(которая будет 0
как она не определена) к числовому значению строки "%Y-%m-%d"
(который будет 0
, поскольку он не является допустимым числом).
Ответ 6
Если вы открыты для использования Perl:
perl -MPOSIX -lne 'if (/Hello/){ print "$_ " . strftime "%Y-%m-%d",localtime }' party.txt
производит этот вывод
Hello Jacky 2015-10-01
Hello Peter 2015-10-01
Hello Willy 2015-10-01
Hello Mary 2015-10-01
Hello Wendy 2015-10-01
Вот как это работает:
-
-n
перемещается вокруг каждой строки входного файла, не печатайте автоматически каждую строку
-
-l
удаляет новые строки перед обработкой и добавляет их обратно
-
-e
выполнить код perl
-
$_
- текущая строка
-
-MPOSIX
загружает модуль POSIX, который включает strftime
-
localtime
и strftime
печатает время, учитывая формат %Y-%m-%d
Ответ 7
используя posix sed (и вспомогательную оболочку из-за отсутствия функции времени в sed)
sed -n "/^Hello/ s/$/ $( date +'%Y-%m-%d' )/p" party.txt
возврат
Hello Jacky 2016-11-10
Hello Peter 2016-11-10
Hello Willy 2016-11-10
Hello Mary 2016-11-10
Hello Wendy 2016-11-10
Ответ 8
Только в gawk:
$ gawk '/Hello/ {print $0, strftime("%Y-%m-%d");}' party.txt
Hello Jacky 2019-09-17
Hello Peter 2019-09-17
Hello Willy 2019-09-17
Hello Mary 2019-09-17
Hello Wendy 2019-09-17