sedのLHSからdateコマンドに引数を渡す

sedのLHSからdateコマンドに引数を渡す

日付文字列を「2016年1月7日12:12:12 EDT」(nessusレポートで)から単に2016-01-07に変換する必要があります。 dateコマンドを使用して、sed(およびPythonとawk)の一致ロジックとsedの外側の変換ロジックを解決しました。 date "Jan 07, 2016 12:12:12 EDT" +%Y-%m-%d

以降の参照で参照できるように、一致グループを使用して月、日、年をキャプチャします。 sedが一致するRHSのパラメータを認識するようにデータコマンドを取得するために正しい引用符の組み合わせが見つからないようです。たとえば、次のようになります。

sed -E "s/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\s[0-9]{1,2}[,].[0-9]{1,4}.?[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}.\w{3})/`date -d "\1\2" "+%Y-%m-%d"`/g" 20170917.csv

引用符を使用すると、日付は最初の引数を無視し、2番目の引数に基づいて今日の日付を印刷します。

"、、、'を使用して逆参照\ 1と\ 2を繰り返しましたが、日付コマンドを実行できるようにバックティック ``で囲むと無視されるようです\"\'

入力はTenable Nessusレポートのcsvです。

ヘッダtmp/20180121.csv

(1)「プラグイン」、「プラグイン名」、「シリーズ」、「重大度」、「IPアドレス」、「プロトコル」、「ポート」、「脆弱?」、「リポジトリ」、「MACアドレス」、「DNS名」 「、「NetBIOS名」、「プラグインテキスト」、「最初の発見」、「最後の観察」、「緩和」、「エクスプロイトフレームワーク」

(2)「73571」、「Oracle Java SEマルチ脆弱性(2014年4月のCPU)(Unix)」、「その他」、「リスク」、「10.140.162.132」、「TCP」、「0」、「はい」 、「個別スキャン」、「00:50:56:c0:00:01」、「host.example.com」、「」、「プラグイン出力:次の脆弱なJavaインスタンスがリモートホストにインストールされています。

パス: /opt/Geneious_linux64_7_1_9_with_jre/ インストール済みバージョン: 1.7.0_51 回復バージョン: 1.5.0_65 / 1.6.0_75 / 1.7.0_55 / 1.8.0_5","2018 年 1 月 21 日 2 1 3月21日 , 2018年 22:14:50 EDT","",""

番号付きの各行はレコードです。 (1) はヘッダー、(2) は残りを示します。

変換する日付文字列は、2行目の最後の行にあります。どちらの場合も、私が必要とするのは簡単です:2018-01-21。

ベストアンサー1

一般的なアプローチは、翻訳テーブルを追加して逆参照を使用することです。

echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
  s/$/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/
  s/^(...) (..), (....).*\1(..).*/\3-\2-\4/'

sed日付を変換するために実行するには、コマンドのGNU拡張:フラグ(GNU拡張も含む)dateを使用する必要があります。esdate-d

echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
  s/^([[:alpha:]]{3} [[:digit:]]{2}, [[:digit:]]{4}).*$/date -d "\1" +%F/e'

しかし、これはdate各入力行に対してシェルを実行することを意味し、これは非常に非効率的です(そして、shが入力に基づいて動的に生成されたコードを解釈することを可能にし、その入力が信頼できるかどうかわからないので危険です)。perlあなたが中にいたくない場合sed

おすすめ記事