ファイルの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
できます。--filter
sed
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
これにより、最初の3つの列のみが削除され、現在のタイムスタンプに置き換えられます。それではしばらくお待ちください。次に、現在のタイムスタンプで次の110行を更新します。