23

我有以下文件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"}'

我会错过什么?

4

8 回答 8

40

gawk(和最新版本的 mawk)具有内置的时间/日期功能,因此无需使用外部工具。

gawk '/Hello/{print NR " - " $0 " - " strftime("%Y-%m-%d")}' party.txt
于 2013-10-23T12:14:15.097 回答
33

一种使用方式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启动时设置,因此即使命令需要很长时间运行,它也不会更改。

于 2012-09-11T09:53:00.253 回答
4
 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
于 2012-09-11T12:20:44.720 回答
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.

于 2016-12-14T09:20:54.913 回答
3

要回答直接问题,您缺少的是date外部命令,因此您需要在 awk 之外调用它并将其作为变量传递(如其他答案之一所示),或者从在 awk 中作为系统命令使用system()内置或管道(如另一个答案所示)。

您看到的原因0是因为表达式date +"%Y-%m-%d"被解释为将变量的数值date0因为它没有定义)添加到字符串的数值"%Y-%m-%d"0因为它不是有效数字)。

于 2012-09-11T21:46:05.970 回答
0

仅在傻瓜中:

$ 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 
于 2019-09-16T20:56:05.900 回答
0

使用 posix sed(以及由于 sed 中缺少时间函数而导致的子 shell)

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
于 2016-11-10T08:06:26.320 回答
0

如果您愿意使用 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

  • localtimestrftime打印时间,给定格式%Y-%m-%d

于 2015-10-01T16:52:08.460 回答