Awk 在访问日志的同一行中显示两个字符串的出现次数

Awk 在访问日志的同一行中显示两个字符串的出现次数,awk,grep,Awk,Grep,假设我们有多个访问日志,格式为下面的访问日志行示例: 66.249.72.214 - - [05/Nov/2011:12:47:37 +0200] "GET /produktas/565638 HTTP/1.1" 200 4699 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 我正在尝试对两个字符串都位于同一行的情况进行grep处理: grep "/produktas" acces

假设我们有多个访问日志,格式为下面的访问日志行示例:

66.249.72.214 - - [05/Nov/2011:12:47:37 +0200] "GET /produktas/565638 HTTP/1.1" 200 4699 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 
我正在尝试对两个字符串都位于同一行的情况进行grep处理:

grep "/produktas" accesslog* | grep -c "200"     
这是可行的,但它只打印所有accesslog文件中这两个字符串的出现次数,即,对于所有日志文件中总共40次的出现次数,它只会输出“40”

我想做的是搜索每一行中的word1和word2,打印每个文件中出现的次数及其相应的文件名和总数,如下例所示:

accesslog_01052019:23    
accesslog_02052019:17    
40    
可能吗?请注意,我的grep命令没有“-o”选项。

EDIT1:与OP聊天后,我知道OP也需要打印匹配的总计数,如果是这样的话,那么下面可能会有所帮助

nawk '
FNR==1{
  if(count){
     close(file)
     print file":"count
  }
  file=FILENAME
  count=""
}
/word1/ && /word2/{
  count++
  total++
}
END{
  if(count){
     print file":"count
  }
  print "Total count is:" total
}'  access_log*


你能试试下面的吗。我没有测试过,因为没有样品。在与OP聊天后,了解到OP的O.s是Sun O.s,因此请将
awk
更改为
nawk
,以了解Sun O.s的以下代码

awk '
FNR==1{
  if(count){
     close(file)
     print file":"count
  }
  file=FILENAME
  count=""
}
/word1/ && /word2/{
  count++
}
END{
  if(count){
     print file":"count
  }
}' accesslog*


让我们来看看下面的输入文件

cat accesslog_01052019
word1 word2
word1 test test test1223224 word2
word1
wrjnjrnbjrnjn
cat accesslog_02052019
word1 word2
word1 test test test1223224 word2
word1
wrjnjrnbjrnjn
现在,当我运行上面的代码时,它给出了正确的结果,如下所示

awk '
FNR==1{
  if(count){
     close(file)
     print file":"count
  }
  file=FILENAME
  count=""
}
/word1/ && /word2/{
  count++
}
END{
  if(count){
     print file":"count
  }
}' accesslog*
accesslog_01052019:2
accesslog_02052019:2
EDIT1:在与OP聊天后,OP知道OP也需要打印匹配的总计数,如果是这样的话,那么下面可能会有所帮助

nawk '
FNR==1{
  if(count){
     close(file)
     print file":"count
  }
  file=FILENAME
  count=""
}
/word1/ && /word2/{
  count++
  total++
}
END{
  if(count){
     print file":"count
  }
  print "Total count is:" total
}'  access_log*


你能试试下面的吗。我没有测试过,因为没有样品。在与OP聊天后,了解到OP的O.s是Sun O.s,因此请将
awk
更改为
nawk
,以了解Sun O.s的以下代码

awk '
FNR==1{
  if(count){
     close(file)
     print file":"count
  }
  file=FILENAME
  count=""
}
/word1/ && /word2/{
  count++
}
END{
  if(count){
     print file":"count
  }
}' accesslog*


让我们来看看下面的输入文件

cat accesslog_01052019
word1 word2
word1 test test test1223224 word2
word1
wrjnjrnbjrnjn
cat accesslog_02052019
word1 word2
word1 test test test1223224 word2
word1
wrjnjrnbjrnjn
现在,当我运行上面的代码时,它给出了正确的结果,如下所示

awk '
FNR==1{
  if(count){
     close(file)
     print file":"count
  }
  file=FILENAME
  count=""
}
/word1/ && /word2/{
  count++
}
END{
  if(count){
     print file":"count
  }
}' accesslog*
accesslog_01052019:2
accesslog_02052019:2

您的设计有很多流程。首先,您是您的命令,因此任何包含“word1”的行都将用作查找“word2”的起点。其次,您询问grep-c“word2”,这意味着您将只计算同时包含“word1”和“word2”的行,在您的示例中为40行。请提供我们可以测试脚本的accesslog文件的有效示例。我使用pipping是因为我希望将第一个单词用作查找第二个单词的起点。我提供了一个访问日志行示例。您的问题必须包含简洁、可测试的示例输入和预期输出,以便我们可以帮助您。您提到没有提供
-o
。这是一个约束吗?不,在手册页上是-o,当尝试使用-o或-E时,我得到一个非法参数错误,运行旧的sunOS版本。您的设计中有许多流。首先,您是您的命令,因此任何包含“word1”的行都将用作查找“word2”的起点。其次,您询问grep-c“word2”,这意味着您将只计算同时包含“word1”和“word2”的行,在您的示例中为40行。请提供我们可以测试脚本的accesslog文件的有效示例。我使用pipping是因为我希望将第一个单词用作查找第二个单词的起点。我提供了一个访问日志行示例。您的问题必须包含简洁、可测试的示例输入和预期输出,以便我们可以帮助您。您提到没有提供
-o
。这是一个约束吗?不,在手册页上是-o,当尝试使用-o或-E时,我得到一个非法参数错误,运行的是旧的sunOS版本