批量读取文件信息

时间:2015-10-14 18:47:49

标签: batch-file

所以我需要写一个批处理,读取.log文件并用它完成某些任务 1.计算登录次数
2.显示成功登录案例的IP地址和文件,并在结束时计算发生了多少个案例(错误代码200) 3.显示不成功登录案例的IP地址和文件,最后计算其中有多少个(错误代码404)

这是我的计划。

@echo off
:pasirinkimas
cls
echo Iveskite 1, jei norite pamatyti visu bandymu prisijungti skaiciu.
echo Iveskite 2, jei norite pamatyti informacija apie visus sekmingus prisijungimus.
echo Iveskite 3, jei norite pamatyti informacija apie visus nesekmingus prisijungimus.
echo Iveskite 4, jei norite baigti darba.

set /p pasirinkimas= Iveskite pasirinkima: 

if %pasirinkimas% == 1 goto bandymai
if %pasirinkimas% == 2 goto sekme
if %pasirinkimas% == 3 goto nesekme
if %pasirinkimas% == 4 goto pabaiga
goto pasirinkimas

:bandymai
echo Prisijungimu skaicius:
findstr "^[1-9]" apache.log | find /v "" /c 
pause>null
goto pasirinkimas

:sekme
findstr /c:" 200 " apache.log>null
for /f "tokens=1,7" %%G in (null) do echo %%G %%H
echo Sekmingu prisijungimu skaicius:
find /c " 200 " null 
pause>null
goto pasirinkimas

:nesekme
findstr /c:" 404 " apache.log>null
for /f "tokens=1,7" %%G in (null) do echo %%G %%H
echo Nesekmingu prisijungimu skaicius:
find /c " 404 " null  
goto pasirinkimas

pause>null

:pabaiga
exit  

它100%有效。我只是想在不将 findstr 输出重定向到空文件的情况下实现相同的结果?或者我不应该担心吗? 这是我尝试的代码版本,没有将输出重定向到空文件

:sekme
findstr " 200 " apache.log | find /v " " 
for /f "tokens=1,7" %%G in ('findstr " 200 " apache.log') do echo %%G %%H  

有了这个程序DOES在屏幕上显示所需的输出,但这需要大约8-10秒(如果文件更大,我相信时间会增长)。加上我不知道如何计算输出线。试图按照与第一个任务:bandymai 相同的原则进行,但是失败了。 有人可以帮忙吗?

编辑: 几个日志文件行

67.195.112.96 - - [22/Feb/2010:00:06:03 +0200] "GET /www/kurpiai/dalyviai/?did=118 HTTP/1.0" 200 41119 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)"
67.195.112.96 - - [22/Feb/2010:00:06:04 +0200] "GET /www/css/master.css HTTP/1.0" 304 145 "http://jazz.lt/www/kurpiai/dalyviai/?did=118" "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)"
88.118.90.240 - - [22/Feb/2010:00:09:43 +0200] "GET /www/kurpiai/dalyviai/?did=30 HTTP/1.1" 200 13140 "http://www.google.lt/search?hl=lt&source=hp&q=gintaras+stankunas&btnG=Google+Paie%C5%A1ka&meta=&aq=f&oq=" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.89 Safari/532.5"
88.118.90.240 - - [22/Feb/2010:00:09:43 +0200] "GET /www/javascript/swfobject.js HTTP/1.1" 200 8969 "http://www.jazz.lt/www/kurpiai/dalyviai/?did=30" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.89 Safari/532.5"
88.118.90.240 - - [22/Feb/2010:00:09:43 +0200] "GET /www/kurpiai/dalyviai/?did=30 HTTP/1.1" 200 40199 "http://www.google.lt/search?hl=lt&source=hp&q=gintaras+stankunas&btnG=Google+Paie%C5%A1ka&meta=&aq=f&oq=" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.89 Safari/532.5"

2 个答案:

答案 0 :(得分:0)

将一个计数器插入循环中以避免两次读取文件:

:sekme
set count=0
for /f "tokens=1,7" %%G in ('type apache.log^|find " 200 "') do (
  echo %%G %%H
  set /a count+=1
)
echo Sekmingu prisijungimu skaicius: %count% 

答案 1 :(得分:0)

计算返回的所有错误代码(似乎是日志文件中的第9个标记),如下一个代码段所示:

@ECHO OFF >NUL
SETLOCAL EnableExtensions

rem  empty/delete all `_conn` environment variables in next loop
for /F "delims==" %%G in ('set _conn 2^>^NUL') do set "%%G="

for /f "tokens=1,7,9" %%G in (
  'findstr "^[1-9]" d:\test\apache.log'
) do (
  set /A "_connALL+=1"
  set /A "_conn%%I+=1"
  echo %%G %%I %%H
)
rem display counters in next line
set _conn

输出略微修改apache.log个文件(粘贴两次然后更改了第9个令牌中的一些):

==> D:\bat\SO\33133270.bat
67.195.112.96 200 /www/kurpiai/dalyviai/?did=118
67.195.112.96 304 /www/css/master.css
88.118.90.240 200 /www/kurpiai/dalyviai/?did=30
88.118.90.240 404 /www/javascript/swfobject.js
88.118.90.240 200 /www/kurpiai/dalyviai/?did=30
67.195.112.96 404 /www/kurpiai/dalyviai/?did=118
67.195.112.96 304 /www/css/master.css
88.118.90.240 200 /www/kurpiai/dalyviai/?did=30
88.118.90.240 404 /www/javascript/swfobject.js
88.118.90.240 200 /www/kurpiai/dalyviai/?did=30
_conn200=5
_conn304=2
_conn404=3
_connALL=10

==>
相关问题