2016-11-07 2 views
0
echo "INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html" | \ 
sed -rn "s/(.*\|)([0-9]{4}-[0-9]{2}-[0-9]{2})\ ([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3})\2\3/p" 

こんにちはみんなから日付と時刻を抽出します。行方不明を教えてください。正規表現は、ログ

私は、

sed: -e expression #1, char 81: unterminated `s' command 
+1

に適しているのですか?すなわち 'sed 's /..../ \ 2 \ 3/p''ですか?がんばろう。 – shellter

答えて

2

ザ・はあなたのコマンドには置換文字列ではありません、それをトラブルシューティングする方法がわからこのエラーが発生しません取得します。 sコマンドには、3つの区切り文字、すなわち、s/pattern/string/が必要です。

これを試してみてください:

$ echo "INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html" | sed -rn "s/.*\|([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}).*/\1/p" 
2016-11-0618:44:07.577 

また、コメントで指摘したように:

  • をあなただけの日付と
  • ドット文字がパターンにエスケープする必要があり、時間(\.[0-9]{3}のための1つのキャプチャグループを必要とします、.[0-9]{3}ではなく)、空白文字は含まない({2} [0-9]
+0

スペース文字をエスケープする必要はありませんが、正確にするにはドット文字のエスケープが必要です(ミリ秒)。最初のグループのグループを作成する必要はなく、それ以降は '\ 1 \ 2'です。そうでなければ動作します。 –

+0

@ Jean-FrançoisFabreそうです、編集しました。 – SLePort

2

awkまたはcutは、このタスク真ん中 `/`文字が欠落し

$ s='INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html' 

$ echo "$s" | awk -F\| '{print $2}' 
2016-11-06 18:44:07.577 

$ echo "$s" | cut -d\| -f2 
2016-11-06 18:44:07.577