sedコマンドを使用してmail.logの日付をタイムスタンプ形式に変更したいと思います。 $()内でグループから日付コマンドに\ 1を渡すのに問題がありますか?
sed -E "s/(^.{15})/$(date -d "\1" "+%s")/" /var/log/mail.log
答え1
引用と拡張に関する講義です:-)
"s/(^.{15})/$(date -d "\1" "+%s")/"
したがって、引数は以下を連結したものです。
's/(^.{15})/$(date -d '
、そのまま配信\1
、シェルによって解釈される- ""(単一スペース)はそのまま渡されます。
+%s
シェルとして解釈される)/
これは現状のまま渡されます。
あなたが望むもの:
s/(^.{15})/$(date -d "\1" "+%s")/
日付部分はシェルによって拡張されます。
これを達成する方法は2つあります。創造的な引用:
"s/(^.{15})/$(date -d '\1' '+%s')/"
またはフェンス:
"s/(^.{15})/$(date -d \"\1\" \"+%s\")/"
date
ただし、これはファイルの各行ではなくコマンドライン拡張で実行されるため、まだ機能しません。だからそれをdate
見るだけでも\1
日付が有効ではないと文句を言います。一度だけ:最初は、すべての行に適用されるわけではありません。
したがって、perl
orbash
より良い選択ですsed
。
答え2
as修飾子をGNU sed
使用してsedコマンドを呼び出すとします。入力データを共有していないので、おそらく15文字より長いと仮定します。/e
s///
sed -E 's/^(.{15})(.*)/echo "$(date -d "\1" "+%s")\2"/e' /var/log/mail.log