如何更新命令生成的每行的日期/时间

时间:2015-09-23 08:44:20

标签: awk timestamp

听起来很简单,但我没有管理......

我希望在命令的输出(返回几行)前加上生成该行的日期/时间。为了简化这里,我以ls为例。真正的命令太冗长了。

ls命令说:

root@gan:~/test# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 23 08:54 file_a
-rw-r--r-- 1 root root 0 Sep 23 08:54 file_b
-rw-r--r-- 1 root root 0 Sep 23 08:54 file_c

这就是我得到的......

root@gan:~/test# ls -l | awk -v var=$(date +"%Y%m%d-%H%M%S") '{ print var " " $0 }'
20150923-102310 total 0
20150923-102310 -rw-r--r-- 1 root root 0 Sep 23 08:54 file_a
20150923-102310 -rw-r--r-- 1 root root 0 Sep 23 08:54 file_b
20150923-102310 -rw-r--r-- 1 root root 0 Sep 23 08:54 file_c

现在,日期/时间是命令执行时的日期/时间,而不是每行ls命令生成的更新。

如何修改此命令,以便生成每一行ls命令的前一行是生成行的日期/时间(而不是命令执行的日期/时间)?

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以为每一行执行date命令,而不是在变量中使用date结果,然后您将获得不同的日期时间。

ls -l |awk -v cmd="date +%Y%m%d-%H%M%S%N" '{cmd|getline d; print d,$0;close(cmd)} '

在上面一行中,您可以看到cmd变量不是date命令的结果(不是$(...))。它只是命令行字符串。

我在模式中添加了%N(纳秒),以便我们可以看到不同的时间戳。

如果我在/tmp/test目录上测试它,输出为:

kent$  ls -l |awk -v cmd="date +%Y%m%d-%H%M%S%N" '{cmd|getline d; print d,$0;close(cmd)} '
20150923-112448877540265 total 4
20150923-112448884685628 -rw-r--r-- 1 kent kent  49 Sep 22 12:31 f
20150923-112448891512367 -rw-r--r-- 1 kent kent   0 Sep 18 12:54 fao
20150923-112448898479494 -rw-r--r-- 1 kent kent   0 Sep 18 12:54 fbo
20150923-112448904315207 -rw-r--r-- 1 kent kent   0 Sep 18 12:54 fco
20150923-112448912507549 drwxr-xr-x 6 kent kent 260 Sep 22 17:18 javassist/