Подтвердить что ты не робот

Как получить текущую дату и время и добавить в конце каждой строки, содержащей "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"}'

Чего мне не хватает?

4b9b3361

Ответ 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