我正在使用一个 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]+//'