如何过滤日志文件中单引号内的字符串?

如何过滤日志文件中单引号内的字符串?

我有一个日志文件,它以这种方式输出信息:

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 -np模式末尾的选项结合使用:仅打印匹配的行
  • '\''是 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\'用作'分隔符

相关内容