[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [己解决]请教代码!!批处理提取相关内容并输出

本帖最后由 keshun 于 2013-5-9 21:12 编辑

请教高手帮忙求代码!!
a.txt是系统日志,文本内容较大有几Mb,希望用批处理取出相关内容到b.txt或c.txt


a.txt原文内容如下:

2013-05-06 14:48:27 PPPoE 客户端连接 ppp61/192.168.82.220 建立成功 !
== 验证用户名: 2140
== 帐号 2140 到期时间 2013-07-06 23:59:59
== 限制下行带宽为 1-1 kbps, 通过设备 ppp61 ...
== 限制上行带宽为 1-1 kbps, 通过设备 ppp61 ...
应用模板: 4M, 上行: 20 kbps, 下行: 400 kbps

2013-05-06 14:48:36 PPPoE 客户端连接 ppp71/192.168.82.225 建立成功 !
== 验证用户名: 3170
== 帐号 3170 到期时间 2013-05-07 23:59:59
== 限制下行带宽为 1-1 kbps, 通过设备 ppp71 ...
== 限制上行带宽为 1-1 kbps, 通过设备 ppp71 ...
应用模板: 4M, 上行: 20 kbps, 下行: 400 kbps
2013-05-06 14:49:55 PPPoE 客户 3170/ppp71/192.168.82.225 已断开
2013-05-06 14:49:55 连接时间: 0 天 0 小时 1 分 19 , 累计上传 78.45 KB, 累计下载 131.56 KB
2013-05-06 14:56:02 PPPoE 客户 2153/ppp39/192.168.82.54 已断开
2013-05-06 14:56:02 连接时间: 0 天 0 小时 56 分 4 , 累计上传 539.90 KB, 累计下载 1.17 MB
2013-05-06 14:56:18 PPPoE 客户 2296/ppp16/192.168.82.92 已断开
2013-05-06 14:56:18 连接时间: 0 天 3 小时 18 分 44 , 累计上传 64.54 MB, 累计下载 1.01 GB
2013-05-06 14:57:09 PPPoE 客户 2212/ppp41/192.168.81.225 已断开
2013-05-06 14:57:09 连接时间: 0 天 1 小时 21 分 50 , 累计上传 1.53 MB, 累计下载 19.67 MB

2013-05-06 14:58:36 PPPoE 客户端连接 ppp16/192.168.83.42 建立成功 !
== 验证用户名: 2150
== 帐号 2150 到期时间 2013-07-14 23:59:59
== 限制下行带宽为 1-1 kbps, 通过设备 ppp16 ...
== 限制上行带宽为 1-1 kbps, 通过设备 ppp16 ...
应用模板: 4M, 上行: 20 kbps, 下行: 400 kbps
2013-05-06 14:59:29 PPPoE 客户 2333/ppp73/192.168.82.68 已断开
2013-05-06 14:59:29 连接时间: 0 天 0 小时 41 分 32 , 累计上传 2.57 MB, 累计下载 41.10 MB


b.txt输出内容如下:

客户 3170, 累计上传 78.45 KB, 累计下载 131.56 KB
客户 2153, 累计上传 539.90 KB, 累计下载 1.17 MB
客户 2296, 累计上传 64.54 MB, 累计下载 1.01 GB
客户 2212, 累计上传 1.53 MB, 累计下载 19.67 MB
客户 2212, 累计上传 2.57 MB, 累计下载 41.10 MB

c.txt输出内容如下:

3170, 78.45 KB, 131.56 KB
2153, 539.90 KB, 1.17 MB
2296, 64.54 MB, 1.01 GB
2212, 1.53 MB, 19.67 MB
2212, 2.57 MB, 41.10 MB
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

在此请教个问题,望高手解答!!!
软路由导出的文本a.txt,直接用批处理提取内容,总是提取不全会出错。
...
keshun 发表于 2013-5-10 01:00



你上传的 a.txt 是 UTF-8 编码。可以用 iconv 转换:
  1. iconv -f utf-8 a.txt >a_gbk.txt
复制代码
(iconv 下载地址请搜索论坛或者 Google)

TOP

.........我说的那个附件的文本编码是UTF8啊,不是ANSI啊,批处理没法操作的,最简单的查看文本编码的方法,直接选择另存为的时候,就能看到当前文本的编码了

TOP

回复 15# hijackle


    原文本和新建相同内容的文本我查询过编码都是GB2312,奇怪的是相同内容的两个文本,原文本出错,新文本正常。

TOP

编码问题,你导出的文本编码是UTF-8,处理前要先转换为ANSI

TOP

本帖最后由 keshun 于 2013-5-11 14:45 编辑

在此请教个问题,望高手解答!!!
软路由导出的文本a.txt,直接用批处理提取内容,总是提取不全会出错。
但在XP下新建个文本把内容复制进出后,在进行批处理就一切正常。
原文本内容进行修改或另存为,而且也进行编码转换后处理都还是不正常,真搞不懂。

附件为原文本,直接用下面批处理会出错,请指教??
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in (a.txt) do (
  4.   set "aa=%%a"
  5.   for %%b in ("!aa: =" "!") do (
  6.     set "bb=%%~b"
  7.     if /i "!bb:~,5!"=="user=" set /p=!bb!   <nul
  8.     if /i "!bb:~,8!"=="profile=" set /p=!bb!   <nul
  9.     if /i "!bb:~,3!"=="cn=" set /p=!bb!   <nul
  10.     if /i "!bb:~,13!"=="expire_since=" set /p=!bb!   <nul
  11.   )
  12.   echo,
  13. ))>>b.txt
复制代码

TOP

GAWK 处理轻松点哦
第一问就不发了
处理第二问
  1. gawk "{if ($5 != \"GB,\") {a[$2]+=$4} else {a[$2]+=$4*1024};t[a[$2]] = $2;if ($8 != \"MB,\") {m[$2]+=$7} else {m[$2]+=$7/1024};p[m[$2]] = $2}END{l=asort(a,b);asort(m,n);for(i=l;i>l-10;i--) {print t[b[i]],\"累计上传\",b[i];print p[n[i]],\"累计下载\",n[i] >\"gbb.txt\"}}" gb.txt >gba.txt
复制代码
1

评分人数

TOP

我太菜了,
压力山大,看不懂也。

TOP

回复 5# 云中听雨

可以看看这个教程: http://www.gnu.org/software/sed/manual/sed.html
论坛中也有一些 sed 教程。

TOP

第一个,练习。
  1. @echo off&setlocal enabledelayedexpansion
  2. findstr /i "[0-9].连接时间" a.txt >$t
  3. findstr /i "[0-9].已断开" a.txt >$u
  4. (for /f "tokens=4,5 delims=/ " %%a in ($u) do (
  5.   set /p ".="
  6.   for /f "tokens=2,3 delims=," %%i in ("!.!") do echo %%a %%b,%%i,%%j
  7. ))<$t>b.txt
  8. (for /f "tokens=2,4,5,7,8 delims= " %%a in (b.txt) do echo %%a%%b%%c%%d%%e)>c.txt
  9. del $?
复制代码
1

评分人数

初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

上面感觉应该还可以简化点,哪位前辈能出手写个纯批的给我们学习下。。。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 4# keshun
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=2,4,5,8,9 delims=,. " %%a in (gb.txt) do (
  3.   set "up=%%b%%c"&set "down=%%d%%e"
  4.   set /a [%%a+=up,]%%a+=down
  5. )
  6. call :sc "[" "MB" "上传" "a.txt"
  7. call :sc "]" "GB" "下载" "b.txt"
  8. del tmp&pause&exit /b
  9. :sc
  10. for /f "tokens=1-2 delims==[]" %%a in ('set %~1') do (
  11.   set "str=##########%%b"
  12.   set "%~1!str:~-10,-2!.!str:~-2! %~2=%%a"
  13. )
  14. set %~1#|sort /+10000 >tmp
  15. set n=0
  16. (for /f "tokens=1,2 delims==[]#" %%a in (tmp) do (
  17.   echo 客户 %%b,累计%~3 %%a
  18.   set /a n+=1
  19.   if !n! equ 10 goto :eof
  20. ))>%4
复制代码
练手,供参考...
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

第2 个问题的!
  1. @echo off
  2. for /f "tokens=2,4,7 delims=, " %%a in (gb.txt) do (
  3. set "a1=%%a" & set "a2=%%b"& set "a3=%%c"
  4. call :leiji
  5. )
  6. set ci=1
  7. :pai
  8. set/a b2=0
  9. set/a c3=0
  10. for /f "tokens=1,2,3" %%a in (tmpp.txt) do (
  11. set "a1=%%a"& set/a a2=%%b& set/a a3=%%c
  12. call :bijiao
  13. )
  14. echo/ %ci%.客户 %b1% ,累计上传%b2:~,-2%.%b2:~-2%MB,累计下载%b3:~,-2%.%b3:~-2%GB >>a.txt
  15. echo/ %ci%.客户 %c1% ,累计下载%c3:~,-2%.%c3:~-2%GB,累计上传%c2:~,-2%.%c2:~-2%MB >>b.txt
  16. set/a ci+=1
  17. if %ci% lss 11 goto pai
  18. del/q tmpp.txt
  19. echo 已经整理完毕!即将退出。
  20. ping -n 2 baidu.com >nul&exit
  21. :bijiao
  22. set/a a2=%a2%
  23. set/a a3=%a3%
  24. if exist a.txt (for /f "tokens=2" %%x in (a.txt) do (if %a1%==%%x goto bijiao2))
  25. if %b2% leq %a2% (set "b1=%a1%" & set/a b2=%a2% & set/a b3=%a3%)
  26. :bijiao2
  27. if exist b.txt (for /f "tokens=2" %%y in (b.txt) do (if %a1%==%%y goto :eof))
  28. if %c3% leq %a3% (set "c1=%a1%" & set/a c2=%a2% & set/a c3=%a3%)
  29. goto :eof
  30. :leiji
  31. if exist tmpp.txt (for /f "tokens=1" %%z in (tmpp.txt) do (if %a1%==%%z goto :eof))
  32. set a2=%a2:.=%
  33. set a3=%a3:.=%
  34. for /f "tokens=2,4,7 delims=, " %%d in (gb.txt) do (
  35. set b1=%%d& set b2=%%e& set b3=%%f
  36. if %a1%==%%d call :leiji2
  37. )
  38. echo %a1% %a2% %a3% >>tmpp.txt
  39. goto :eof
  40. :leiji2
  41. set b2=%b2:.=%
  42. set b3=%b3:.=%
  43. set/a a2+=%b2%
  44. set/a a3+=%b3%
  45. goto :eof
复制代码

TOP

本帖最后由 云中听雨 于 2013-5-9 18:13 编辑

我也写了个第1个问题的:
  1. @echo off
  2. for /f "tokens=3* delims= "  %%a in (a.txt) do (
  3. if "%%a"=="PPPoE" (set "b=%%b")
  4. if "%%a"=="连接时间:" (set "b1=%%b"& call :main)
  5. )
  6. pause
  7. exit
  8. :main
  9. set "b=%b:~0,7%"
  10. set "b1=%b1:*累计上传=累计上传%"
  11. echo/%b%,%b1% >>b.txt
  12. for /f "tokens=2,4,5,7*" %%c in ("%b% %b1%") do echo/%%c,%%d %%e%%f %%g >>c.txt
  13. goto :eof
复制代码

TOP

看着版主的一行代码,左看右看,看不懂!
能解释一下吗!

TOP

返回列表