截断日期的精度

截断日期的精度

我正在使用一个 bash 脚本,该脚本会轮询来自多个不同系统的构建进度。如果构建完成,它stat会生成一个日志文件来查找上次编辑的时间,然后将该时间输入到date构建完成时生成人类可读的输出。

因为这是在一些不同的系统上运行的,所以我们的输出如下所示:

sys00 finished around:        2015-06-11 01:42:29.484345955 -0700
sys01 finished around:        2015-06-11 01:21:17.560101447 -0700
sys02 finished around:        2015-06-11 03:51:56 -0700
sys03 finished around:        2015-06-11 04:32:12 -0700
sys04 finished around:        2015-06-11 01:40:47.977893386 -0700
sys05 finished around:        2015-06-11 01:16:12.158137851 -0700

我的首要任务是使它们看起来相同,并且由于我不需要第一个和最后两个系统的额外精度,所以我只想将其砍掉。我一直在尝试这样做awk

echo $TIME | awk '[0-9]{9} {gsub('', '[0-9]{9}')}' -

但收效甚微。我还不够熟悉,无法sed决定它是否是一个更合适的工具。我不确定是否date可以指示不要这样做。这是date我当前正在使用的命令:

COMMAND='date -r `stat -f "%m" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"'

$BASENAME我们用来查找日志文件的基本路径在哪里。)

经期后如何摆脱那些讨厌的数字?

答案1

对于sed答案,您可以使用它来过滤掉小数:

sed 's/\.[0-9]\{1,\}//'

怎么运行的 :

  • \.将匹配文字.
  • [0-9]\{1,\}将匹配一位或多位数字

生成的模式意味着“匹配一个文字.后跟一个或多个数字”,并将其替换为任何内容。

答案2

如果我正确理解你的问题。您想要的输出是

out.txt

sys00 finished around: 2015-06-11 01:42:29 sys01 finished around: 2015-06-11 01:21:17 sys02 finished around: 2015-06-11 03:51:56 sys03 finished around: 2015-06-11 04:32:12 sys04 finished around: 2015-06-11 01:40:47 sys05 finished around: 2015-06-11 01:16:12

使用awk的字段分隔符

awk -F。 '{print $1}' inputfile.txt | '{print $1}' awk -F- '{打印 $1, $2, $3}'

如果你想要这样的输出 out2.txt

sys00 finished around: 2015 06 11 01:42:29 -0700 sys01 finished around: 2015 06 11 01:21:17 -0700 sys02 finished around: 2015 06 11 03:51:56 -0700 sys03 finished around: 2015 06 11 04:32:12 -0700 sys04 finished around: 2015 06 11 01:40:47 -0700 sys05 finished around: 2015 06 11 01:16:12 -0700

awk -F。 '{print $1}' tst.txt | '{print $1}' awk -F- '{打印 $1, $2, $3, "-0700"}'

答案3

我很惊讶你收到了任何stat -f "%m" ...无效的信息。您确定复制了命令的当前版本吗?

看起来您使用的是 -c (指定格式)而不是 -f (文件系统),您获得了提供给 stat 的文件列表的挂载点,然后将其截断为单个路径,然后使用 date stat 挂载点并提供一种格式。

您可以采取多种措施来加速或简化,其中第一件事就是不使用日期。

COMMAND='stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1'

不幸的是,这取决于区域设置并包括纳秒,因此我们可以使用

COMMAND='LC_ALL=C stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1|sed "s/\.[0-9]\+//"'

第二个选择是没有日期通话统计

COMMAND='date `stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"'

如果仍然显示纳秒(不应该显示,请提交错误报告),您可以使用更简单的正则表达式进行过滤。

COMMAND='date `stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"|sed "s/\.0\+//"'

还有一件事可能会加快速度(取决于统计所有日志文件或生成另一个任务是否更快),那就是在 stat 之前过滤文件

COMMAND='ls "$BASENAME"'/../logs/catTest*.log|head -n1|LC_ALL=C xargs stat -fc "%y" |sed "s/.[0-9]+//'

相关内容