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