Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何导出当前日期和时间,并在包含';你好';_Date_Awk_Grep - Fatal编程技术网

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
    在处理之前删除换行符,然后将其添加回

  • -e
    执行perl代码

  • $是当前行

  • -mpoix
    加载POSIX模块,其中包括
    strftime

  • localtime
    strftime
    根据格式
    %Y-%m-%d

使用posix sed(以及由于sed中缺少时间函数而产生的子外壳)

返回

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