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

すべてのスクリプトを1列に1つのスクリプトとしてスプレッドシートに入れたいです。調査中に「date」などのコマンドをcsvファイルに出力する方法が見つかりませんでした。特定のテキストや変数をcsvファイルに出力する方法はいくつかありますが、コマンドが見つからないことがわかりました。

bashのヘッダーを無視して、「Date」の出力をcsvファイルの特定の列に印刷したいと思います。

日付変数出力を使用する:

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

スクリプトは2番目の列にのみ出力し、2番目の列が存在し、空の行が見つかった場合にのみ出力します。

awkを知っている場合は、最初または3番目の列に簡単に出力されるように変更できます。そもそもあなたが欲しいのはこれでしたか? - - - 編集する - - -

さて、もう少しスタイリッシュなスクリプトを手に入れました。文書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
}

1日が始まると(おそらく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

したがって、各ジョブが実行された時点のタイムスタンプを取得できます。実行されていないジョブのプレースホルダーはまだ存在し、一日の終わりに削除できます。

関連情報