使用awk从多个文件中提取数据

时间:2019-03-09 20:58:04

标签: search awk grep extract

我有1000个这样的文件:

text1.txt

<span class="store-time">OPEN SINCE <em>Aug 9, 2010</em></span>

text2.txt

<span class="store-time">OPEN SINCE <em>Aug 9, 2012</em></span>

我想从1000个文件中提取所有日期,像这样在每个新行中提取每个日期:

Aug 9, 2010
Aug 9, 2012
...

2 个答案:

答案 0 :(得分:0)

如果您确定文件全部具有这种格式,则可以使用简单的sed表达式

sed -E -e 's/^<span class="store-time">OPEN SINCE <em>([A-Z][a-z]+ *[0-9]+, *[0-9]+)<\/em><\/span>/\1/' 

它只是找到行的开头,然后是看起来像日期的内容(字母,然后是空格和数字,然后是逗号,再是一个数字),然后是行的结尾。
cat将您所有的文件发送给sed输入,您将获得日期列表。

但是,正如注释中指出的那样,解析xml文件可能有问题(例如,请参见RegEx match open tags except XHTML self-contained tags)。如果xml标签分散在多行上,则脚本将无法提取信息,例如包含以下数据

<span class="store-time">
OPEN SINCE <em>Aug 9, 2012</em>
</span>

要处理这种情况,有更强大的工具。作为工具xmlstarletperl类的集合,例如XML::libXML。它们能够执行更防崩溃的解析,但是使用起来更复杂。

如果您完全确定所有文件都具有正确的格式,那么sed脚本可以解决您的问题。

答案 1 :(得分:0)

对于解析诸如awksed之类的XML工具,肯定不是首选,因为它们是基于行的,而XML不是。

要在awk中完成工作,可以使用类似以下内容的

awk '$0 ~ /<span class="store-time">.*/ {gsub(/^.*<em>/,"",$0) gsub(/<\/em>.*/,"",$0); print $0}' *.html

此命令获取所有html文件(* .html),并搜索以<span class="store-time">开头的行。 然后用空字符串替换从行首到第一个<em>的所有内容。对于</em>之后的所有内容(包括</em>),它都执行相同的操作