루프는 110라인마다 변경됩니다.

루프는 110라인마다 변경됩니다.

파일의 110줄마다 현재 날짜로 타임스탬프를 변경하고 싶습니다. 파일에 cat을 사용하고 이를 sed로 파이프하여 대체 작업을 수행한 다음 파일에 씁니다. 110개 행마다 날짜만 변경하여 변경 당시의 현재 날짜를 갖도록 하는 방법이 있습니까? 다음은 현재 타임스탬프를 변경하는 방법의 예입니다. 이것은 잘 작동하지만 전체 파일을 변경합니다.

cat /path/to/file | sed "s/[a-zA-Z]\{3\}\s[0-9]\{1,2\}\s[0-9]\{2\}\:[0-9]\{2\}\:[0-9]\{2\}/$(date +"%b %d %H:%M:%S")/g" >> /path/to/newfile

나는 해결책을 찾기 위해 꼬리와 머리로 모험을 떠났지만 아래 루프는 처음 110개만 완료했습니다.

i=0
jump=110
while [ $i -le 1100 ]
do
tail -n $i | head -n $jump /path/to/file | sed "s/[a-zA-Z]\{3\}\s[0-9]\{1,2\}\s[0-9]\{2\}\:[0-9]\{2\}\:[0-9]\{2\}/$(date +"%b %d %H:%M:%S")/g" >> /path/to/newfile
i=$((%i + $jump))
done

입력 예는 다음과 같습니다.

Apr 15 16:29:19 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159

출력은 변경된 날짜와 동일해야 합니다.

Apr 1 16:29:19 generic.com WindowsLog Computer=COMP-user-0001   User=user-0001  TimeGenerated=1554103759    TimeWritten=1554103759

답변1

왜 이렇게 하려는지 잘 모르겠습니다. 하지만 GNU 버전이 있는 경우 해당 옵션을 사용하여 기존 명령을 통해 파일 블록을 처리 split할 수 있습니다 .--filtersed

split -l 110 file --filter='
  sed "s/[a-zA-Z]\{3\}\s[0-9]\{1,2\}\s[0-9]\{2\}\:[0-9]\{2\}\:[0-9]\{2\}/$(date +"%b %d %H:%M:%S")/"
' > path/to/newfile

이를 설명하기 위해 더 짧은(25줄) 입력 파일을 사용하고, 5줄마다 분할하고, 결과가 크게 다른지 확인하기 위해 타임스탬프에 나노초를 추가했습니다.

$ split -l 5 file --filter='
    sed "s/[a-zA-Z]\{3\}\s[0-9]\{1,2\}\s[0-9]\{2\}\:[0-9]\{2\}\:[0-9]\{2\}/$(date +"%b %d %H:%M:%S.%N")/"
  '
Apr 01 13:35:36.817804684 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.817804684 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.817804684 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.817804684 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.817804684 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.824106329 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.824106329 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.824106329 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.824106329 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.824106329 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.831402445 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.831402445 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.831402445 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.831402445 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.831402445 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.840339832 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.840339832 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.840339832 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.840339832 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.840339832 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.844512992 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.844512992 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.844512992 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.844512992 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159
Apr 01 13:35:36.844512992 generic.com WindowsLog Computer=COMP-user-0001  User=user-0001  TimeGenerated=1523806159   TimeWritten=1523806159

답변2

이 시도,

lineNo=0
jump=110
while [ "$lineNo" -le 1100 ] && [ "$lineNo" -gt 0 ]
do
        sed -i "${lineNo}s/[a-zA-Z]\{3\}\s[0-9]\{1,2\}\s[0-9]\{2\}\:[0-9]\{2\}\:[0-9]\{2\}/$(date +"%b %d %H:%M:%S")/g" kk
lineNo=$((lineNo + jump))
done

단일 sed 명령을 사용하여 이 작업을 수행할 수 있습니다.

  • sed -i "${lineNo}....파일은 우리가 전달한 지정된 줄 번호에서만 편집됩니다.
  • [ "$lineNo" -gt 0 ]오류를 방지하려면 값을 0으로 전달하는 변수를 무시하세요.

답변3

awk '{$1=$2=$3="";$0=strftime("%b %d %H:%M:%S")" "$0;print;if(NR%110){system("sleep 1")}}' filename

이렇게 하면 처음 세 개의 열만 제거되고 현재 타임스탬프로 대체됩니다. 그럼 잠시만 기다리십시오. 그런 다음 현재 타임스탬프로 다음 110개 행을 업데이트합니다.

관련 정보