我有一个日志文件,它以这种方式输出信息:
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
模式末尾的选项结合使用:仅打印匹配的行'\''
是 shell 表示法,用于在单引号字符串(参数'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]++
第一次为 true,然后为 false-F\'
用作'
分隔符