使用 sed 或 awk 轉換每行中的 unix 紀元時間戳列

使用 sed 或 awk 轉換每行中的 unix 紀元時間戳列

我有一個包含以下輸入範例資料的檔案:

1137921146.499 180900 61.153.158.197 1409 
1137921158.698 181622 61.153.158.197 1409
1137921758.163 180026 221.226.124.114 1374
1137921802.016 179485 121.13.128.132 1409

第一列是 unix 紀元時間戳,我需要將其轉換為人類可讀的格式,另外我希望資料如下分隔

Sun Jan 22 01:12:26 PST 2006|180900|61.153.158.197|1409   
Sun Jan 22 01:12:38 PST 2006|181622|61.153.158.19|1409

我嘗試使用 sed 's/ {1,}/|/g' 新增分隔符號並使用 date -d @1137921146.499 轉換日期。但我無法用一個指令將這兩個組合在一起..

答案1

您可以像這樣使用 awk 程式:

awk '{ print strftime("%c",$1)"|" $2"|"$3"|"$4 }' file

核心是使用strftime函數將epoch轉換為日期格式

這是輸出:

#awk '{ print strftime("%c",$1)"|" $2"|"$3"|"$4 }' file
Sun Jan 22 10:12:26 2006|180900|61.153.158.197|1409
Sun Jan 22 10:12:38 2006|181622|61.153.158.197|1409
Sun Jan 22 10:22:38 2006|180026|221.226.124.114|1374
Sun Jan 22 10:23:22 2006|179485|121.13.128.132|1409

PS 或者您可以使用隱式輸出分隔符號:

awk  'BEGIN { OFS="|"} {$1= strftime("%c",$1) }1' file

答案2

使用您已經知道的知識:

  • GNUdate可以透過給定 來將時間戳記轉換為格式化日期@timestamp
  • 將空格替換為|將為您提供所需的輸出。

為此,我們添加

  • GNUdate可以對檔案進行操作,批次轉換日期。

要使用 GNU 批次轉換日期,date我們必須提取時間戳記並添加前綴@

$ sed 's/^\([^ ]*\).*$/@\1/' data.in
@1137921146.499
@1137921158.698
@1137921758.163
@1137921802.016

sed表達式將每一行替換為前綴為 的第一個空格分隔欄位@

使用bash(和ksh93,或任何理解進程替換的 shell):

$ date -f <( sed 's/^\([^ ]*\).*$/@\1/' data.in )
Sun Jan 22 10:12:26 CET 2006
Sun Jan 22 10:12:38 CET 2006
Sun Jan 22 10:22:38 CET 2006
Sun Jan 22 10:23:22 CET 2006

然後我們需要獲取輸入資料的其他欄位並替換分隔符號:

$ cut -d ' ' -f 2- data.in | tr ' ' '|'
180900|61.153.158.197|1409
181622|61.153.158.197|1409
180026|221.226.124.114|1374
179485|121.13.128.132|1409

然後我們將這兩件事與|分隔符號貼在一起:

$ paste -d '|' <( date -f <( sed 's/^\([^ ]*\).*$/@\1/' data.in ) ) <( cut -d ' ' -f 2- data.in | tr ' ' '|' )
Sun Jan 22 10:12:26 CET 2006|180900|61.153.158.197|1409
Sun Jan 22 10:12:38 CET 2006|181622|61.153.158.197|1409
Sun Jan 22 10:22:38 CET 2006|180026|221.226.124.114|1374
Sun Jan 22 10:23:22 CET 2006|179485|121.13.128.132|1409

答案3

或用你的外殼:

while read timestamp pid ip port; do
  echo "$(date -d @$timestamp)|$pid|$ip|$port"
done <yourfile

相關內容