web-dev-qa-db-ja.com

引数として置換パターンを使用して置換としてコマンドを実行するsed

ログファイルの時間を次のように置き換えようとしています。

_cat mlog.log | sed -e "s/^[0-9\.]*/\$(date -d @&)/"
_

常に最初に$(date -d $&)を実行しますが、最初に置換を実行せずにコマンドを実行するのはなぜですか?

私はそれが次のようになると思った:

_date -d @121223232
_

ログは次のようになります。

_1428688532.169   peerdiff 2
1428688534.269   peerdiff 1 
_
2
user2700517

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"'
1
Ole Tange

このように動作する理由は、シェルの動作方法です。まず、できることはすべて解釈し始めます。つまり引用符で囲まれているものを解釈します。引用符で囲まれているものを解釈しません。echo "$(date)"echo '$(date)'を比較してみてください。 、たとえば次を使用:

awk '{ system("echo `date -d @"$1"` "$2" "$3);}' < mlog.log

つまりawkがファイルを列に分割し、必要に応じて列を入力するシステムコマンドを実行します。 sed sコマンドにはShellコマンドを呼び出す機能がないため、sedを同じ方法で使用することはできません。

0
ludvik02