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

모든 스크립트를 열당 하나의 스크립트로 스프레드시트에 넣고 싶습니다. 조사하는 동안 "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

스크립트는 두 번째 열에만 출력하며, 두 번째 열이 존재하고 비어 있는 행을 찾은 경우에만 출력합니다.

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

따라서 각 작업이 실행된 시점의 타임스탬프를 얻을 수 있습니다. 실행되지 않은 작업에 대한 자리 표시자는 여전히 존재하며 하루가 끝나면 삭제할 수 있습니다.

관련 정보