次のように情報を出力するログファイルがあります。
2016-01-01: foo bar fnord
2016-01-01: this is static 'this is of interest' some blob bar
2016-01-01: this is static 'this is of interest' some hurz poit
2016-01-01: foo bar fnord
2016-01-01: this is static 'this is of interest as well' some blob bar
一重引用符内の文字列だけを印刷したいと思います。重複したエントリは次のように削除する必要があります。
this is of interest
this is of interest as well
私は引用符の間に何があるかを見つけるために正規表現を試しましたが、うまくいきませんでした。たとえば、次のようになります。
grep -io "static.*" | sed -e '\w+'|'\w+(\s\w+)*'
答え1
cut
正規表現を書くよりも使いやすいです。
grep -io "static.*" logfile.txt | cut -d "'" -f2 | sort -u
こうしてみてください。次のように印刷されます。
this is of interest
this is of interest as well
答え2
「sedのみ」ソリューションは次のとおりです。
sed -n 's/^.*'\''\([^'\'']*\)'\''.*$/\1/p' file
これは次のように分類されます。
sed -n
p
パターンの末尾にあるオプションと一緒に使用されます。一致する行だけを印刷します。'\''
's/…/…/p'
一重引用符で囲まれた文字列(パラメータ)の中に一重引用符を指定するためのシェル表記。- したがって、パターンはランダム
^.*'\''\([^'\'']*\)'\''.*$
な文字シーケンス()で始まり、^.*
その後に一重引用符 '、[^'\'']*
一重引用符()以外の文字シーケンス、その後に一重引用符 '、残りの文字が続く行と一致します。終わり。ワイヤー(.*$
)。 ([^'\'']*\)
sed
一致の一部が変数に格納されるように括弧で囲みます。\1
- 最後に、一致する行全体を
s/pattern_explained_above/\1/p
変数の内容\1
(つまり、一重引用符内の文字列部分)に置き換えて印刷(p
オプション)します。このオプションにより、-n
パターンと一致しない他の行はすべて抑制されます。
答え3
努力する
awk -F\' '/static/ { if (!seen[$2]++) print $2 ;}'
そして
static
静的文字列です!seen[$2]++
最初は真、次は偽-F\'
'
区切り文字として使用