ログファイルの時間を次のように置き換えようとしています。
_cat mlog.log | sed -e "s/^[0-9\.]*/\$(date -d @&)/"
_
常に最初に$(date -d $&)
を実行しますが、最初に置換を実行せずにコマンドを実行するのはなぜですか?
私はそれが次のようになると思った:
_date -d @121223232
_
ログは次のようになります。
_1428688532.169 peerdiff 2
1428688534.269 peerdiff 1
_
Mlog.logがスペースで区切られている場合:
cat mlog.log |Perl -a -ne 'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join(" ",@F)."\n"'
Mlog.logがタブ区切りの場合:
cat mlog.log |Perl -a -F"\t" -ne 'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join("\t",@F)."\n"'
このように動作する理由は、シェルの動作方法です。まず、できることはすべて解釈し始めます。つまり引用符で囲まれているものを解釈します。引用符で囲まれているものを解釈しません。echo "$(date)"
とecho '$(date)'
を比較してみてください。 、たとえば次を使用:
awk '{ system("echo `date -d @"$1"` "$2" "$3);}' < mlog.log
つまりawkがファイルを列に分割し、必要に応じて列を入力するシステムコマンドを実行します。 sed sコマンドにはShellコマンドを呼び出す機能がないため、sedを同じ方法で使用することはできません。