我想使用 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
因此,您将获得每个作业运行时间的时间戳。未运行的作业的占位符仍然存在,并且可以在一天结束时删除。