以下の「sometest、readtest、writetest」の前に、これらすべての項目を削除する必要があります。
2019-12-09 10:04:34 +0000 Test (err): sometest: some : text server:::test
2019-12-09 10:04:34 +0000 Test (notice): readtest: some
2019-12-09 10:04:34 +0000 Test (info): writetest: some ::: text
予想出力:
sometest: some : text server:::test
sometest: some
sometest: some ::: text
答え1
そしてsed
:
sed 's/[^:]*:[^:]*:[^:]*: //' file
または、拡張正規表現(ERE)を使用してください。
sed -E 's/([^:]*:){3} //' file
変える
:
その後に文字以外の文字が続きます:
(3回)。- その後に空白文字が続きます。
空の文字列として。
出力:
sometest: some : text server:::test
readtest: some
writetest: some ::: text
答え2
sed
角かっこがあると確信している場合は、次のことを試すことができます。
sed 's/^.*): //' file
出力:
sometest: some : text server:::test
readtest: some
writetest: some ::: text
または切り取りを使用してください。
cut -d':' -f4- file | sed 's/^ //'
答え3
これを行うために選択できるさまざまな方法があるため、これは興味深い質問です。そのうちのいくつかは、予期しない入力があるときにやや堅牢です。堅牢性のために、sometest、readtest、writetestキーワードを明示的に一致させますか?または3番目のコロンと一致させてください。 cutコマンドを使用するか、sed、awk、perl、または 。 。
無視する必要がある日時でコロンを指摘すると、問題がより明確になります。
# after 3rd colon (but forgetting to strip the space after it)
sed s/[^:]*:[^:]*:[^:]*://
# this cut command does the same as that sed
cut -d: -f 4-
# A cut command delimiting on space might be better actually
# assuming two words always to be stripped "Test (something)"
# this cut command leaves out the whitespace as expected
cut -d" " -f6-
# after 3rd colon (strip leading space):
sed "s/[^:]*:[^:]*:[^:]*: *//"
# after 3rd colon (strip leading WHITEspace):
sed "s/[^:]*:[^:]*:[^:]*:\s*//"
# cut all those things explicitly before "sometest,readtest,writetest"
sed -E 's/.*(some|read|write)(test:)/\1\2/'
# exactly the same command works in perl
perl -pe 's/.*(some|read|write)(test:)/\1\2/'
期待される出力に無効な先行キーワードが含まれているようです。
sometest: some : text server:::test
readtest: some
writetest: some ::: text
最後に、例とログファイルには、「test(something)」ビットを保持するためにcutコマンドを使用するなど、タイムスタンプを削除したい場合があります。
# A cut command to just strip the timestamp and leave in the "Test (something)"
cut -d" " -f4-