2017-01-19 3 views
3

:私はにタイムスタンプを有効にする私はいくつかのテキストが続くUnixタイムスタンプを出力し、コマンド持つ別のコマンドの戻り値でbashコマンド出力の部分文字列を交換してください(例えば、日付にタイムスタンプを回す)

> mycommand 
1484169138 happened XYZ 
1484169139 happened XZY 
... 

を人間が読める文字列ではありませんが、どのように考え出すことができないようです。

私はさまざまなツール(sedawkなど)を試しました。次のanswer on stackoverflowはかなり近いようです。しかし私は、FreeBSDの午前eを使用するためにGNUの拡張機能を持っているように見えるしない:

$ mycommand |sed -E 's#([0-9]{10})#date -r \1#e' 
sed: 1: "s#([0-9]{10})#date -r \1#e": bad flag in substitute command: 'e' 
+0

あなたは 'date -r XX'を実行しているようですが、' -r'はあなたが探しているようには見えません。正確な 'date'コマンドは何を実行しますか? – fedorqui

答えて

1

あなたはあなたのPOSIXシェルでwhileループでdateコマンドを使用して日付を再フォーマットすることができます(私は指摘すべきでしょうではありませんFreeBSDのデフォルトのシェル)。

$ while read d t; do printf "[%s] %s\n" "$(date -r "$d" '+%F %T')" "$t"; done < x.txt 
[2017-01-11 16:12:18] happened XYZ 
[2017-01-11 16:12:19] happened XZY 

whileループも、パイプの端部であってもよい。

$ mycommand | while read d t; do ...; done 
+0

IFSをnullに設定しても問題ありませんか?私は簡単なテストを行い、最初のフィールドを2つの変数の行の残りの部分から分離するために読み込み用にスペースを設定しなければなりませんでした。 – Fred

+0

これは私が以前に知りませんでした(そしてテストによって推測された) "読んだ"振る舞いに依存しているようですが、変数よりもフィールドが多い場合、最後の変数は行が読み込まれます。 – Fred

+1

@fedorqui、あなたの編集をロールバックしました。 'IFS ='はすべての行が '$ d'になるように行の分割を解除し、OPの' mycommand'がバックスラッシュ結合の複数行出力を生成するかどうかわからないので、 '-r'適切である。このような重要な変更を行う前に、インテントを検証し、影響をテストしてください。 – ghoti

1

BSD sed提供するシェル・コマンドを使用することを可能GNU- sed特異/eオプションをサポートしていませんあなたが発見したように、s関数呼び出しの置換文字列。

しかし、awkは、同様の機能を提供することができます

$ awk '{ ("date -r " $1) | getline $1 } 1' <<'EOF' 
1484169138 happened XYZ 
1484169139 happened XZY 
EOF 
Wed Jan 11 16:12:18 EST 2017 happened XYZ 
Wed Jan 11 16:12:19 EST 2017 happened XZY 
秒でUnixエポック時間を含む、第一フィールドからシェルコマンドを構築 ("date -r " $1)
  • 、例えば、date -r 1484169138、ENとシステム上の東部時間帯の-USロケールでは、Wed Jan 11 16:12:18 EST 2017が得られます(GNUdate-rオプションのセマンティクスが異なることに注意してください)。

  • ... | getline $1は、シェルコマンド(sh -c経由)を実行し、変数$1のコマンドのstdout出力をキャプチャします。すなわち、は、の最初のフィールドをコマンドの出力に置き換えます。

  • 1は、(修正された)レコードを簡単に印刷するための共通の省略形です。

関連する問題