sedまたはawkを使用して各行のunix epochタイムスタンプ列を変換する

sedまたはawkを使用して各行のunix epochタイムスタンプ列を変換する

次の入力サンプルデータを含むファイルがあります。

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 epochタイムスタンプで、これを人間が読める形式に変換する必要があり、データを次のように分離したいと思います。

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 を使用して日付を変換してみました。ただし、これら2つを1つのコマンドに結合することはできません。

答え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

すでに知っていることを活用してください。

  • dateタイムスタンプをフォーマットされた日付に変換するためのGNUを提供できます@timestamp
  • スペースを変更すると、|目的の結果が得られます。

このために我々は追加します

  • GNUはdateファイルに対して操作を実行し、日付をまとめて変換できます。

GNUを使用して日付を一括変換するには、dateタイムスタンプを抽出してプレフィックスを追加する必要があります@

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

このsed式は、各行をプレフィックス付きのスペースで区切られた最初のフィールドに置き換えます@

bash(andksh93またはプロセス置換を理解するすべてのシェル)を使用してください。

$ 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

次に、|次の2つを区切り文字で貼り付けます。

$ 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

関連情報