重击日期命令正在进行更新

时间:2018-06-21 23:16:43

标签: bash date

是否有一种方法可以使bash中的date(或类似的东西)每次通过新行传送到正在进行的更新中?

我正在尝试获取持续的输出,通过awk传递时间戳,然后将其写入具有正确写入日期的日志文件中(例如log.2018-06-21)。新的一天到来时,输出将自动开始写入新的一天的日志文件。

简单地输入./my_server | awk >> log.date-of-write

这是我尝试过的(出于测试目的,格式为%T而不是%F

$ awk '{ print strftime("%F %T %Z:  ") $0; fflush(); }' |& tee -a "log.$(date +"%T")"
test1
2018-06-21 22:56:38 UTC:  test1
test2
2018-06-21 22:56:40 UTC:  test2
test3
2018-06-21 22:56:42 UTC:  test3
^C
$ ls
log.22:56:36
$ cat log.22\:56\:36 
2018-06-21 22:56:38 UTC:  test1
2018-06-21 22:56:40 UTC:  test2
2018-06-21 22:56:42 UTC:  test3
$

所有测试均写入同一文件,因为原始时间以该格式使用。

2 个答案:

答案 0 :(得分:1)

是的,这可以做到;您需要做的是定期生成一个新文件名,检查该文件名是否与您将输出写入的文件名相同,然后重新打开标准输出以指向新位置(如果它们不同)。

请注意,代替printf %(...)T的{​​{1}}惯用语是一项新功能,如果您正在运行旧版本的bash,则可能不存在。 (您当然可以 切换到date,但是这样做会慢得多)。

date

运行此命令时:

log_with_rotation() {
  local outfile_name outfile_curr line
  outfile_curr=
  while IFS= read -r line; do
    printf -v outfile_name 'log.%(%H:%M:%S)T' -1
    if [[ $outfile_name != "$outfile_curr" ]]; then
      outfile_curr=$outfile_name
      exec >"$outfile_name"
    fi
    printf '%s\n' "$line"
  done
}

...我得到两个输出文件:

your_program() {
  printf '%s\n' "Cluster one, line one" "Cluster one, line two"
  sleep 2
  printf '%s\n' "Cluster two, line one" "Cluster two, line two"
}

your_program | log_with_rotation

答案 1 :(得分:0)

logger() {
    file="log.$(date +"%T")"
    echo -n $(date) >> $file
    eval "$*" >> $file
}

只需将命令和参数放在函数名称之后,例如:

logger ls -la

我不知道这是不是你想要的。如果我误解了,您必须重新表述这个问题。