Date 如何导出当前日期和时间,并在包含';你好';
我有以下文件Date 如何导出当前日期和时间,并在包含';你好';,date,awk,grep,Date,Awk,Grep,我有以下文件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"}' 我可能遗漏了什
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"}'
我可能遗漏了什么?使用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
启动时设置,因此即使命令运行时间较长,它也不会更改
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
要回答这个直接的问题,您缺少的是
date
是一个外部命令,因此您需要在awk外部调用它并将其作为变量传入(如其他答案之一所示),或者使用system()
内置命令或管道从awk内部将其作为系统命令调用(正如另一个答案所示)
您看到0
的原因是表达式date+%Y-%m-%d”
被解释为将变量date
(未定义时为0
)的数值添加到字符串%Y-%m-%d”
的数值中(该变量将为0
,因为它不是有效数字).gawk(以及mawk的最新版本)具有内置工具,因此无需使用外部工具
gawk '/Hello/{print NR " - " $0 " - " strftime("%Y-%m-%d")}' party.txt
如果您愿意使用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
执行perl代码-e
$是当前行
加载POSIX模块,其中包括-mpoix
strftime
和localtime
根据格式strftime
%Y-%m-%d
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
此解决方案应适用于任何awk:
awk '/Hello/ {cmd="(date +'%H:%M:%S')"; cmd | getline d; print d,$0; close(cmd)}' party.txt
魔法发生在close(cmd)
语句中。它强制awk
每次执行cmd
,因此,日期每次都是实际的日期
cmd |获取第d行
读取cmd
的输出并将其保存到仅在gawk中的d
:
$ 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
如果结合danfuzz的答案,它将接近完美。这个解决方案的问题是,日期设置一次。如果您有一个文件(或流)解析需要几秒钟或几分钟,每个条目都有完全相同的日期/时间戳。另外,awk不是支持-v的通用命令,nawk是。在Solaris上,这不起作用,但如果用nawk替换awk,它会起作用,您还可以使用gawk(兼容POSIX/GNU的版本).我更喜欢Alin的答案,它适用于所有awk实现和操作系统(前提是awk被gawk取代)如果与danfuzz的答案相结合,它将接近完美。如果与steve或kent的答案相结合,它将接近完美。我唯一要做的改变是在awk不是POSIX/GNU兼容版本的操作系统上用gawk替换awk。好吧,这并删除不属于原始请求的行号。
$ 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