行の先頭に日付と時刻が表示されるようにログファイルを再フォーマットしようとしています。私のログは次のようになります:
blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
このように見せてほしい:
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt
。
これらのパターン結果を情報文字列の左側に移動するにはどうすればよいですか?助けてくれてありがとう。
承認された回答:
sed
をお試しください 次の正規表現を使用:
$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
ここでは、sed
を使用しました 目的の出力を取得するためののグループ置換方法。
-
\(.*\)
blah, blah, blah
まで一致します,[[:blank:]]
があるので,
に一致する その後。 -
\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)
行の残りの部分(最初に配置したい部分)と一致します。
次に、\2 \1
があります。 最初に2番目のグループを配置し、次にスペース、次に最初のグループを配置します。
元のファイルはfile.txt.bak
としてバックアップされます 、それを望まない場合は、-i
だけを使用してください -i.bak
の代わりに 。
**目的の出力が得られますが、この場合、正規表現/sedを使用することは最適なソリューションではありません。
編集: [Internet disconnected] Friday, Mar 13,2015 15:48:34
のような行がある場合 、これを試してください:
$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
以前の正規表現では、\(.*\),[[:blank:]]
がありました (最初の一致するグループの後のコンマと空白)、出力に新しい行を含めるために、最初の一致するグループ\(.*[^,]\)
を作成しました。 カンマで終わっていないことを確認し、,*
と一致させます つまり、1つ以上のコンマ。つまり、新しいsed
コマンドは、言及されたすべての場合に機能します。