使用 bash 将日期输出到特定列

使用 bash 将日期输出到特定列

我想使用 bash 脚本将日期输出到 csv 列中,忽略标题。我有这个,但它只给出缩写的星期几,而不是将其放在特定的列中:

date | awk '{print $1}' >> date.csv

这是运行命令后我想要的 csv:

bash_script1,bash_script2,bash_script3
Thu Mar  2 03:11:01 EST 2023,Tue Mar 21 05:39:01 EDT 2023,Thu Mar  2 04:19:01 EST 2023
Thu Mar  2 04:19:01 EST 2023,Tue Mar 21 05:40:01 EDT 2023,Thu Mar  2 04:20:01 EST 2023
Thu Mar  2 04:20:01 EST 2023,Tue Mar 21 05:41:01 EDT 2023,Fri Mar  3 03:11:01 EST 2023
Fri Mar  3 03:11:01 EST 2023,,
Fri Mar  3 03:12:02 EST 2023,,

我的 cron 计划中有多个 bash 脚本,我想知道它们何时执行,而不是使用以下命令创建单独的文本文件:

date >> bash_script2.txt

我想将所有脚本放入一个电子表格中,每列一个脚本。在我的研究过程中,我无法找到如何将“日期”之类的命令输出到 csv 文件中。我发现有很多方法可以将特定文本或变量输出到 csv 文件中,但没有找到命令。

我只是想将“日期”的输出打印到 csv 文件的特定列中,而忽略 bash 的标题。

使用日期变量输出:

TheDate=`date +"%F %T %Z"`

printf "\n$TheDate,," >> date.csv #would go into first column
printf "\n,$TheDate," >> date.csv #would go into second column
printf "\n,,$TheDate" >> date.csv #would go into third column

上面的方法有效,但 printf 似乎不知道如何用完列中的第一个可用空行:

+---------+---------+---------+---------+
| script1 | script2 | script3 | script4 |
+---------+---------+---------+---------+
| date    |         |         |         |
+---------+---------+---------+---------+
| date    |         |         |         |
+---------+---------+---------+---------+
|         | date    |         |         |
+---------+---------+---------+---------+
|         |         | date    |         |
+---------+---------+---------+---------+
|         |         | date    |         |
+---------+---------+---------+---------+

答案1

我有一个有点糟糕的脚本,它的功能与您想要的类似:

awk -i inplace  -v myvar="$(date)" 'BEGIN {FS=OFS="," ; flag = 0}; \
{if (!flag && $2=="") {flag=1; print $1, myvar , $3} else print $0}' date.csv

该脚本仅输出到第二列,并且仅在找到第二列存在且为空的行时才输出。

如果您了解 awk,可以修改它以轻松输出到第一列或第三列。这符合您一开始想要的吗? - - - 编辑 - - -

好的,我得到了一个更精致的脚本。文件col.awk

BEGIN{
    FS=OFS=",";
    flag=0;
    total=3;

    "date +\"%F %T %Z\"" | getline date;
} 
{
    if(!flag && $which==""){
        flag=1;
        sub(/.*/,date,$which) ; 
    }
    print 
}
ENDFILE{
    if(!flag ){
        count=which-1
        while(count >0){
            printf ",";
            count--;
        }
        printf  date
        count=total-which
        while(count >0){
            printf ",";
            count--;
        }
            printf "\n";
    }
} 

你用类似的东西运行它:

awk -i inplace -v which=2 -f col.awk date.csv

edit2:修复了 ENDFILE 的某些内容以允许就地编辑

答案2

我发现有很多方法可以将特定文本或变量输出到 csv 文件中,但没有找到命令。

将输出存储date到变量中,然后继续:

$ TheDate=`date`
$ echo $TheDate
Mon 27 Mar 2023 06:01:59 PM CDT

不过,普通旧的date不太好排序。试试这个:

$ TheDate=`date +"%F %T %Z"`
$ echo $TheDate
2023-03-27 18:04:15 CDT

编辑:啊,你正在制作一个矩阵。

您如何知道脚本是否在特定日期运行?

你能得到所有这些信息吗附加到 date.csv?

例如:

TheDate=`date +"%F %T %Z"`
if [[ Script_1_ran ]]; then Date1=$TheDate; else Date1=; fi
if [[ Script_2_ran ]]; then Date2=$TheDate; else Date2=; fi
if [[ Script_3_ran ]]; then Date3=$TheDate; else Date3=; fi
if [[ Script_4_ran ]]; then Date4=$TheDate; else Date4=; fi

echo ${Date1},${Date2},${Date3},${Date4}

编辑2:

一个函数:

script_ran()
{
    # $1 is the script number (1,2,3,4)
    local X=$(($1 + 64))
    local ndx=`printf \\$(printf '%03o' $X)` # converts to A,B,C,D
    local TimeStamp=`date +"%F %T %Z"`
    sed -i -e '$s/${X}/${TimeStamp}/g' date.csv
}

在一天开始时(大概在 cron 中),运行以下命令来添加今天的行:

date +"%F,A,B,C,D" >> date.csv

当脚本 1 运行时,运行此函数:

script_ran 1

同上脚本 2,3 和 4。

在今天(3 月 27 日)结束时,如果只运行脚本 1 和 3,最后一行将类似于:

2023-03-27,2023-03-27 05:12:34,B,2023-03-27 14:23:45,D

因此,您将获得每个作业运行时间的时间戳。未运行的作业的占位符仍然存在,并且可以在一天结束时删除。

相关内容