0

我想在 Linux 中使用以下命令编写一个 bash 脚本AWK SED grep curl,找到一个特定的单词然后计算它。

这是我的脚本:

#!/bin/sh

echo "URL:"
read url
urlsou=$(curl -s "$url")
result=$(awk '/test/ {f=1} /link/ {g=1} /WOW/ {h=1} !f && !g && h; /testend/ {f=0} /linkend/ {g=0} /wow/ {h=0}' | grep -o "WOW" | grep -c "WOW")
echo "Total :" "$result"

当我使用我的脚本时我得到 0,但是当我只使用AWK以下命令和AWK具有 HTML 源的文件时,awk '/test/ {f=1} /link/ {g=1} /WOW/ {h=1} !f && !g && h; /testend/ {f=0} /linkend/ {g=0} /wow/ {h=0}' example | grep -o "WOW" | grep -c "WOW"我得到了正确的答案。

这是我的示例文件(但我的真实文件非常复杂):

WOW1wow
linklinkend
wow1WOWwow123WOW
testtestend
WOWWwow
link WOW test testend linkend wow
WOW2wow
link WOW 123 wow linkend
  1. 尝试awk '/test/ {f=1} /link/ {g=1} /WOW/ {h=1} !f && !g && h; /testend/ {f=0} /linkend/ {g=0} /wow/ {h=0}' example | grep -o "WOW" | grep -c "WOW" example结果为5
  2. 尝试awk '/test/ {f=1} /link/ {g=1} /WOW/ {h=1} !f && !g && h; /testend/ {f=0} /linkend/ {g=0} /wow/ {h=0}' example | grep -o "WOW" example结果为4
  3. 尝试使用脚本结果为0

正确答案是 5

我认为问题在于如何在脚本中将 urlsou 变量传递给 AWK,或者如何为 urlsource 创建临时文件。

我的问题是什么,我如何在没有任何编程语言或额外命令的情况下修复它?

4

3 回答 3

0

这是摘录man grep

-c,$--count

抑制正常输出;而是打印每个输入文件的匹配行数。使用-v, --invert-match option (见下文)计算不匹配的行数。(-c由 POSIX 指定。)

现在这是您的命令的结尾:

awk ... | grep -o "WOW" | grep -c "WOW" | grep -o "WOW" | grep -c "WOW"

您的最后一个grep -o "WOW"永远不会起作用,因为它适用于计数。

然后我认为这里有很多管道。我确信可以在单个 awk 中做到这一点……但是,您应该向我们提供有关您的输入流和预期输出的更多详细信息。

于 2013-10-28T22:34:22.523 回答
0

尝试这样做:

#!/bin/bash

echo "URL:"
read url
urlsou=$(curl -s "$url")
# \b is "word boundaries"
result=$(sed 's/\b/\n/g' <<< "$urlsou" | grep -c WOW)
echo "Total :" "$result"

你已经提到你不想学习另一种语言,好吧。但是要知道这只是一个快速的'n'dirty脚本,仅此而已。

于 2013-10-28T22:21:33.960 回答
0

在您的脚本中,awk 从 STDIN 读取。您应该将 curl 的输出传递给它:

最简单的方法是:

result=$(awk '/test/ {f=1} ...' $urlsou | ...

另一种方法是将 curl 的输出直接通过管道传输到 awk:

curl -s "$url" | awk '...' | ...
于 2014-02-06T08:07:32.507 回答