使用bash过滤FB档案中的消息

时间:2014-06-04 12:31:23

标签: bash awk sed grep

我有点问题。我需要过滤一个非常混乱的.htm文件。它没有新行,只是一连串的混乱。

enter image description here

基本上我从facebook获得了一个消息存档。我需要过滤来自特定人员的消息,以便我以后可以使用它。该文件中充满了特殊字符,对我来说有点复杂。

每封邮件都是这样的。

<span class="user">User Name</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I NEED</p>

我唯一需要的是来自特定人的消息并将其输出到txt文件。

我感谢你的每一次帮助。

谢谢

5 个答案:

答案 0 :(得分:2)

grep喜欢这些东西:

$ grep -Po '(?<=<p>)[^<]*' file
MESSAGE I NEED

它开始从<p>抓取字符串并一直持续到找到新的<


如果您想从<span class="user">User Name</span>块中指定的特定用户获取数据,那么您可以执行以下操作:

$ user="User Name"
$ grep "<span class=\"user\">$user</span>" file | grep -Po '(?<=<p>)[^<]*'
MESSAGE I NEED

或硬编码名称:

$ grep '<span class="user">User Name</span>' file | grep -Po '(?<=<p>)[^<]*'
MESSAGE I NEED

答案 1 :(得分:1)

另一个awk命令,

$ awk -v FS='(<p>|</p>)' '{print $2}' file
MESSAGE I NEED

我认为你需要这样的东西,

$ cat file
<span class="user">Bar</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I NEED</p>
<span class="user">Foo</span><span class="meta">Date and sh*t</span></div></div><p>FOO starts with the letter F</p>

$ awk -v FS='(<p>|</p>)' '/Bar/{print $2}' file
MESSAGE I NEED

答案 2 :(得分:0)

有人这样吗?

awk '/Name/ {gsub(/<[^>]*>/, " ");$1=$1}1' file
User Name Date and sh*t MESSAGE I NEED

将名称更改为您需要的名称,这将删除标记。

答案 3 :(得分:0)

sed版本:

$ sed -n 's/^.*<p>\([^<]*\)<.*$/\1/p' file
MESSAGE I NEED

答案 4 :(得分:0)

您的文件中没有换行符,因此要将其分解为每用户记录,我们需要将其他内容标识为记录分隔符。看起来</p>是显而易见的选择。现在我们需要将每个记录分解为字段,以便将它们与每个<...>对分开。现在给出一个包含2条记录的示例输入文件:

$ cat file
<span class="user">Jim Bob</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I NEED</p><span class="user">Bobby Joe</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I DONT NEED</p>

我们可以输出字段(记录号,字段号,字段内容):

$ awk -v RS='</p>' -F'<[^>]+>' '{for (i=1;i<=NF;i++) print NR, i, $i}' file
1 1
1 2 Jim Bob
1 3
1 4 Date and sh*t
1 5
1 6
1 7
1 8 MESSAGE I NEED
2 1
2 2 Bobby Joe
2 3
2 4 Date and sh*t
2 5
2 6
2 7
2 8 MESSAGE I DONT NEED
3 1

并看到用户名是每条记录中的第二个字段,消息是第8个。

鉴于此,您可以轻松地测试/打印您想要的任何字段:

$ awk -v RS='</p>' -F'<[^>]+>' -v user="Jim Bob" '$2==user{print $8}' file
MESSAGE I NEED

请注意,上面使用GNU awk进行多字符RS。对于其他awks,最简单的方法是在调用脚本之前将所有</p>字符串转换为控件字符,然后使用该控件字符作为RS。