如何从awk结果中提取文本?

时间:2019-06-08 04:27:33

标签: regex awk sed grep

此命令返回找到“关于”一词的整行。

! lynx -source google.com/search?q=india | awk '/About */'

这将返回类似这样的内容...

<div id=gbar><nobr><b class=gb1>Search</b> <a class=gb1 href="http://www.google.com/search?hl=en&tbm=isch&source=og&tab=wi">Images</a> <a class=gb1 href="http://maps.google.com/maps?hl=en&tab=wl">Maps</a> <a class=gb1 href="https://play.google.com/?hl=en&tab=w8">Play</a> <a class=gb1 href="http://www.youtube.com/results?gl=US&tab=w1">YouTube</a> <a class=gb1 href="http://news.google.com/nwshp?hl=en&tab=wn">News</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">Drive</a> <a class=gb1 style="text-decoration:none" href="https://www.google.com/intl/en/about/products?tab=wh"><u>More</u> &raquo;</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.com/history/optout?hl=en" class=gb4>Web History</a> | <a  href="/preferences?hl=en" class=gb4>Settings</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=en&passive=true&continue=http://www.google.com/search%3Fq%3Dindia" class=gb4>Sign in</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div><font size="-2"><br clear="all"></font><table border="0" cellpadding="3" cellspacing="0"><tr><td valign="top"><a href="/webhp?hl="><img src="/images/branding/searchlogo/1x/googlelogo_desk_heirloom_color_150x55dp.gif" height="55" width="150" border="0"></a></td><td valign="bottom"><nobr><form name="gs" method="GET" action="/search"><input type="text" name="q" maxlength="2048" title="Search" value="india" size="41"><font size="-1">&nbsp;</font><input type="Submit" name="btnG" value="Search"><font size="-1">&nbsp;</font></form></nobr></td><td width="100%" valign="middle"><nobr><font size="-2"><a href="/advanced_search?q=india&amp;hl=">Advanced Search</a><br><a href="/preferences?q=india&amp;hl=">Preferences</a></font></nobr></td></tr></table><table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td bgcolor="#3366CC" height="1"><img height="1" width="1" alt=""></td></tr></table><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#D5DDF3"><tr><td><img height="2" width="1" alt=""></td></tr><tr><td><table width="100%" border="0" cellpadding="0" cellspacing="4"><tr><td nowrap><font size="-1"><strong>Web</strong></font></td><td nowrap align="right"><font size="-1">About 10,730,000,000 results (<b>0.34</b> seconds)</font></td></tr></table></td></tr><tr><td><img height="1" width="1" alt=""></td></tr></table><p><a href="/url?q=https://en.wikipedia.org/wiki/India&amp;sa=U&amp;ved=2ahUKEwiih9Hri9niAhWvuVkKHXWUCLkQFjAAegQIDBAH&amp;usg=AOvVaw2q-I4x7L6MSaWE9ziLkwjR"><b>India</b> - Wikipedia</a><table cellpadding="0" cellspacing="0" border="0"><tr><td class="j"><font size="-1"><b>India</b> (ISO: Bh&#257;rat), also known as the Republic of <b>India</b> (ISO: Bh&#257;rat Ga&#7751;ar&#257;jya), <br>

但是我只想返回结果数。例如

预期结果:

  

大约7,970,000,000个结果

(或仅包含不带单词的数字,例如“关于”)

我实际上正在寻找的是返回计数中的逗号数。例如上面的示例有3个逗号,这表示计数为“非常高”,如果没有,(结果少于1000个),计数应返回“低”。

4 个答案:

答案 0 :(得分:3)

使用-dump代替-source。这消除了html代码:

$ lynx -dump google.com/search?q=india | awk -F, '/About/'
   Web About 7,410,000,000 results (0.33 seconds)

仅打印数字:

$ lynx -dump google.com/search?q=india | awk '/About/{print $3}'
7,410,000,000

仅打印逗号数:

$ lynx -dump google.com/search?q=india | awk -F, '/About/{print NF-1}'
3

答案 1 :(得分:2)

使用grep的{​​{1}}接口。 awk选项将只打印与正则表达式匹配的行的一部分,而不是整个行。

-o

答案 2 :(得分:2)

如果只希望数字中包含逗号,则可以使用:

pax> echo 'About 7,970,000,000 results' | awk '/About/{gsub(/[^,]/,"",$0);print length($0)}'
3

详细信息:

/About/                - select line with "About"
gsub(/[^,]/,"",$0)     - replace all non-commas with nothing in whole line
print length($0)       - print out count of the commas

请记住,只有Lynx的输出与您最初所说的完全一样 (就像我的echo中那样,事实并非如此)。

对于实际输出(许多HTML),您可能期望使用更多的逗号。在这种情况下,您需要剥离掉About之前的所有内容以及此后的下一个空格中的所有内容(仅保留数字),然后在 that 位中计算逗号。

以下内容似乎可以很好地与您的实际查询配合使用,前两个gsub命令去除了数字本身之外的所有内容,其余就是我上面提出的内容:

awk '/About /{
       gsub(/^.*About /,"",$0);
       gsub(/ .*$/,"",$0);
       gsub(/[^,]/,"",$0);
       print length($0)}'

答案 3 :(得分:1)

使用类似于以下内容的表达式对您来说应该很容易做到:

lynx -source google.com/search?q=india | grep -o 'About [0-9,]+ results'

对于逗号,我们只使用:

([0-9,]+)

Demo