這是我擁有的一堆檔案中的日期格式
$cat ./file.log
20220405T130001 message1
20220405T130002 message2
20220405T130003 message3
20220405T130004 message4
20220405T130005 message5
我可以通過這樣做將其轉換為可用的日期格式:
$cat ./file.log | sed 's/^\(.\{4\}\)/\1-/' | sed 's/^\(.\{7\}\)/\1-/' | sed 's/\(.\{10\}\)./\1 /' | sed 's/^\(.\{13\}\)/\1:/' | sed 's/^\(.\{16\}\)/\1:/
2022-04-05 13:00:01 message1
2022-04-05 13:00:02 message2
2022-04-05 13:00:03 message3
2022-04-05 13:00:04 message4
2022-04-05 13:00:05 message5
這似乎非常低效。在 bash 中是否有更簡單/更好的方法來完成此任務?
更改規則如下
-在前 4 個字符后插入-在上一條規則之后的下 2 個字符之后插入-在上一條規則之后的下 2 個字符之后插入- 在上一條規則之后的下 2 個字符之后替換
T為 :在上一條規則之后的下 2 個字符之后插入:在上一條規則之后的下 2 個字符之后插入
uj5u.com熱心網友回復:
假設您總是在輸入檔案中獲得相同的格式,單個 sed 可以處理多個捕獲組:
sed -E 's/^(.{4})(..)(..)T(..)(..)/\1-\2-\3 \4:\5:/' file
2022-04-05 13:00:01 message1
2022-04-05 13:00:02 message2
2022-04-05 13:00:03 message3
2022-04-05 13:00:04 message4
2022-04-05 13:00:05 message5
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。簡單的解釋是,將欄位分隔符設定為TOR 空格。在主程式中列印子字串(使用substr的函式awk),其中根據需要的輸出使用第 1、第 2 和第 3 個欄位列印相應的子字串。
awk -F'T| ' '
{
print substr($1,1,4)"-"substr($1,5,2)"-"substr($1,7,2),substr($2,1,2)":"substr($2,3,2)":"substr($2,5,2),$3
}
' Input_file
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/457186.html
上一篇:將日期傳遞給服務器時時區更改
