Chinaunix

标题: 【已解决】用tr解决了……没想到涉及到的知识点不少 [打印本页]

作者: 响亮的名字    时间: 2016-03-15 09:29
标题: 【已解决】用tr解决了……没想到涉及到的知识点不少
本帖最后由 响亮的名字 于 2016-03-15 14:31 编辑

现有url.txt,每行一个网址,通过curl获取源代码,判断源代码中是否包含A或者B,包含则输出改行,不包含则输出字符串“无内容”。

由于始终会有一些url的源代码中不包含A或B,但是必须保证url和输出内容成一一对应关系,否则会由于某些行没有内容,而导致不能一一对应,不利于排查有问题的url。

现有几种思路:

(1)最开始,是直接for i in `cat url.txt`;do curl "$a"|awk '$0~/A/||$0~/B/ {print $0}'|sed 略 >结果.txt
这样会由于有些url的源代码中A/B都不包含,所以这些url就没有输出内容,导致与url.txt错位,不能进一步处理到想要结果

(2)后来尝试awk使用if判断,结果导致else会对源代码每一行进行判断(而非整个源代码),会出现很多空行(实际只需要连续空行保留一个空行),后面使用paste -d把结果和url两个文件组合起来,得到想要结果。暂时不知道怎么处理……

(3)把变量i声明为临时环境变量,在后续管道在行首或行尾打印变量出来……但也没有找到适合这种情况的方法。

现在的脚本代码是这样的:

#!/bin/bash
#!/bin/sh
for i in `cat url.txt`
do
{
curl -s "$i"|iconv -f GB2312 -t UTF-8|awk '{$0~/哈哈哈/||$0~/啪啪啪/'|sed "s/<[^>]*>//g"
} &
done >ok.txt
wait

扒了很多文,感觉很无理(没学过编程,接触cygwin shell只有两个月时间……orz


----------------------------------------------------------------------
成功解决了一部分问题

(1)首先不能多线程跑,多线程的话顺序会乱掉……妈的智障啊www
(2)核心思想是,先处理源代码,去掉html标签,然后去掉空行和tab,然后把换行替换成tab,最后awk -F"\t"把所有数据放在一行分割成域,最后用awk if else判断行上是否包含字符串,然后打印特定的域。sed不能替换换行……要用tr -t '\n' '\t'才行。
然后,当curl因为网络遇到问题的时候……就会出问题(当没有获取到源代码的时候),这个问题还没想到怎么解决。

总之谢谢大家了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2