BASH:长字符串中的grep文本

时间:2019-01-04 20:07:54

标签: bash sed grep

任何人都可以解释如何编写一个正则表达式以在包含元数据的非常长的txt文件中获取值。整个文件没有任何换行符,只是一个很长的字符串,很难阅读或分析

我需要在密钥用户名后添加grep值。有人可以帮忙吗?似乎在为这种情况写出适当的正则表达式扩展名时被困住了

    .."somevalue\";s:7:\"text1\";s:8:\"username\";s:9:\"USER1\";s:7:\"company\";s:3:\"text2\";s:5:\  "somevalue\";s:11:\"text11\";s:8:\"username\";s:15:\"USER2\";s:7:\"company\";s:17:\"XXXX\";s:5:\...   "somevalue\";s:15:\"text110000\";s:8:\"username\";s:12:\"USER3_HERE\";s:7:\"company\";s:18:\"yyyyy\";s:

在上面的示例中,我需要以下输出

    USER1
    USER2
    USER3_HERE

3 个答案:

答案 0 :(得分:1)

使用Perl就是

perl -wn -le 'print for /\\"username\\";.*?\\"([^\\"]+)/g' filename

-n-逐行处理文件,但不打印任何内容

-l-处理行尾

-e-运行以下代码

print for /\\"username\\";.*?\\"([^\\"]+)/g

只要看到\"username\";,然后再跟\",就打印捕获的输出。

输出

$ perl -wn -le 'print for /\\"username\\";.*?\\"([^\\"]+)/g'
    .."somevalue\";s:7:\"text1\";s:8:\"username\";s:9:\"USER1\";s:7:\"company\";s:3:\"text2\";s:5:\  "somevalue\";s:11:\"text11\";s:8:\"username\";s:15:\"USER2\";s:7:\"company\";s:17:\"XXXX\";s:5:\...   "somevalue\";s:15:\"text110000\";s:8:\"username\";s:12:\"USER3_HERE\";s:7:\"company\";s:18:\"yyyyy\";s:

USER1
USER2
USER3_HERE

另请参见

perlrun(用于命令行开关)

perlre(使用的正则表达式)

答案 1 :(得分:0)

使用GNU awk(为了清楚起见,我在此添加了字段编号的打印输出,在i前面打印了$i):

$ gawk 'BEGIN{FS="\\\\\""} {for (i=1;i<=NF;i++) if (match($i, /USER/)) print i, $i}' file
7 USER1
18 USER2
29 USER3_HERE

如果您想要这些字段之后的字段:

$ gawk 'BEGIN{FS="\\\\\""} {for (i=1;i<=NF;i++) if (match($i, /USER/)) print $i, $(i+1)}' file
USER1 ;s:7:
USER2 ;s:7:
USER3_HERE ;s:7:

您可以使用GNU grep:

$ ggrep -oP 'USER[^;]*;([^\\]*)\\"company' file
USER1\";s:7:\"company
USER2\";s:7:\"company
USER3_HERE\";s:7:\"company

如果只需要匹配组,也可以使用Perl:

$ perl -lnE 'say for /USER[^;]*;([^\\]*)\\"company/g' file
s:7:
s:7:
s:7:

答案 2 :(得分:0)

对于像这样的输入:

cat <<EOF >file
s:7:\"text1\";s:8:\"username\";s:9:\"USER1\";s:7:\"company\";s:3:\"text2\";s:5:\  "somevalue\";s:11:\"text11\";s:8:\"username\";s:15:\"USER2\";s:7:\"company\";s:17:\"XXXX\";s:5:\...   "somevalue\";s:15:\"text110000\";s:8:\"username\";s:12:\"USER3_HERE\";s:7:\"company\";s:18:\"yyyyy\";
EOF

我们可以:

< file \
tr ';' '\n' |
sed 's/^.*:\\"\(.*\)\\"$/\1/' |
grep -x "USER1\|USER2\|USER3_HERE"
  • ;换行
  • 过滤掉:\"...\"之间的文本
  • 仅对USER1 USER2或USER3_HERE字符串使用grep