无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
123
返回列表 发新帖
楼主: dos时代菜鸟
打印 上一主题 下一主题

awk for dos 的简单应用(awk实例)

[复制链接]
61#
发表于 2010-4-9 08:21:19 | 只看该作者
dos时代菜鸟批处理写得这么好,把我请求的批处理改一下:
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D2

各位版主也帮帮忙啊!
回复

使用道具 举报

62#
 楼主| 发表于 2010-8-24 12:31:20 | 只看该作者
Gawk 实现两个文件列融合
0.txt gdisk 1 >0.txt 获取

1.txt gdisk 1 /raw >1.txt 获取


我们的目的是 要把这两个文件 红圈 中的内容融合成一个文件,并与ghost磁盘标号一一对应。
2.txt 的内容如下:2.txt 内容的获取 通过命令:gawk –f p.awk 0..txt >2.txt




获取这个2.txt 文档的目的 是可以明朗的看出 没有被分配盘符的分区的 ID 号和 分区标号的对应关系 ,
这在DOS下判断没有被分配盘符分区中都有哪些是可以被IFSDRV 装载 非常重要。
同时也可以明朗的已分配盘符与 硬盘分区标号 间的对应关系。


p.awk 的内容如下:
BEGIN {
  while ((getline<"1.txt")>0) {
      if (($0~"PRIMARY") || ($0~"LOGICAL")) {n+=1 ; p0[n]=$4 }
  }

}
{
    if  (($0~"PRIMARY") || ($0~"LOGICAL")) {

       m+=1;print "1:"m,p0[m],substr($0,1,4),substr($0,15)
  }
}
END {}

命令:gawk –f p.awk 0.txt >2.txt
   用 gawk 调用脚本 p.awk 逐行分析 0.txt 的内容并把 结果传递给 文件2.txt
BEGIN 段:
   通过 WHILE 循环 处理 GETLINE 指令获取的 1.txt 为内容的文本流,如果1.txt形成的文本流的当前行包含 PRIMARY 或者LOGICAL 就将变量 n 增加 1 ,同时向数组p0 中添加一个以 n的内容 为名字以当前行第四的字段为内容的数组元素。
主程序段:{}
   逐行分析 0.txt ,如果当前行包含 PRIMARY 或者LOGICAL 就将变量 m 增加 1 ,显示1:m ,数组 p0 中元素p[m]的内容,以及当前行其他所需内容。


[ 本帖最后由 dos时代菜鸟 于 2010-8-24 12:44 编辑 ]

p.rar

991 Bytes, 下载次数: 71, 下载积分: 无忧币 -2

回复

使用道具 举报

63#
 楼主| 发表于 2010-8-26 13:39:49 | 只看该作者
利用 gdisk + awk +ndlist +bat 实现全部硬盘分区序列列表和最后一个可行备份分区位置(%lastp%)的确定,支持多个硬盘信息的搜集。
有多个 主引导分区时 lastp 被设置为 最后一个主引导分区
少于2个主引导分区时 lastp 被设置为 最后一个逻辑分区
只有一个分区且为主引导分区时 lastp 为 空
只有一个分区且为逻辑分区时    lastp 为该逻辑分
如果装载了 ifsdrv 也可以把ifsdrv 装载的分区盘符对应于表中。
awk/ndlist/drv0.awk/disks1.bat  另需要 gdisk.exe  v11自己找吧。

这里需要3个文件的整理融合: ndlist.txt (ifsdrv装载盘符列表)  gd.txt(gdisk 获取的硬盘分区信息列表) gdraw.txt(gdisk /raw 获取的分区信息主要用到他的 sys 列)
还有就是 没有分配盘符的可以被ifsdrv 装载的分区 对应的 id 类型表:0C,1C,04,14,06,16,0B,1B,07,17,01,11,0E,1E,83


因为 gdisk 体积庞大,调用耗时较多,运行会慢一些,但是 gdisk 获取的磁盘信息与ghost 兼容性更好一些,毕竟都是 ghost出品的。所以,要用ghost做备份,探测分区信息还是用 gdisk 要更稳妥一些。

disks1.bat 内容:
@echo off
if not %1*==* goto s2
if exist drv0.txt del drv0.txt >nul
ndlist >ndlist.txt
cls
echo 正在获取硬盘分区信息,请等待....
gdisk |awk 'NF>0 && $1!="Disk" {print "call disks1.bat "$1}' >disksx.bat
call disksx.bat
del disksx.bat
echo.
echo 全部硬盘分区序列:
echo 标号,盘符,ID,状态,类型,卷标,大小,格式,% ...
type drv0.txt

awk '/PRIMARY/' DRV0.TXT|AWK '{if (FNR==1) print "set p0="$1;p9=$1} END {print "set p9="p9}>%temp%\px.bat
awk '/LOGICAL/' DRV0.TXT|AWK '{l9=$1} END {print "set l9="l9}>>%temp%\px.bat
call %temp%\px.bat
del  %temp%\px.bat
set lastp=%p9%
if (%p9%)==(%p1%) set lastp=%l9%
for %%c in (p0 p9 l0 l9) do set %%c=
echo Last_partiton is %lastp%
goto end

:s2
echo 正在分析硬盘 #%1 ...
gdisk %1 >gd.txt
gdisk %1 /raw >gdraw.txt
awk -f drv0.awk -v d=%1 gd.txt >>drv0.txt

:end
if exist gd.txt del gd.txt >nul
if exist gdraw.txt del gdraw.txt >nul
if exist ndlist.txt del ndlist.txt >nul


-----------------
drv0.awk 内容:
BEGIN {d()}
{drv3()}
END {}
function drv3() {
if (($0~"PRIMARY") || ($0~"LOGICAL")) {
   m+=1
   dd=substr($0,2,2)
   if (substr($0,2,2)!~":") {dd="?."
     if ((ifs[1]!="Unavailable") && (ifsdrv~id[m])) {y+=1;dd=ifs[y]}
   }
   printf "%5s" ,d":"m;printf "%4s",dd" ";print id[m],substr($0,15)
}
}

function d() {
   ifsdrv="0C,1C,04,14,06,16,0B,1B,07,17,01,11,0E,1E,83"
   while ((getline<"gdraw.txt")>0) {
    if (($0~"PRIMARY") || ($0~"LOGICAL")) {n+=1;id[n]=$4}
   }
   while ((getline<"ndlist.txt")>0) {l+=1;ifs[(l-1)]=$1}
}

----------------------------

[ 本帖最后由 dos时代菜鸟 于 2010-8-26 21:45 编辑 ]
回复

使用道具 举报

64#
 楼主| 发表于 2010-11-28 17:30:15 | 只看该作者
用awk 编辑脚本 完成 inifile 的功能,据说inifile 有*.ini 文件大小限制。

inifile.bat 地用法:可以读取/修改/添加 特定项目组中特定项目的数值。
%1 the option:read/edit/append ; 命令参数:读取,改写,添加
%2 the ini_file                ; ini文件名字
%3 the [TOP] in ini_file       ; ini文件中项目组的名字
%4 the item's name in ini_file ; 子项目的名字
%5 the item' value in ini_file ; 子项目的数值
%6 the out_to file             ; 信息输出文件.
如果不指定%6 ,结果将放入initemp.txt 中.
如果指令为修改/添加 ,那么initemp.txt 中将是修改好的整个ini文件的内容
如果指令为读取      ,那么initemp.txt 中将保存读取的子项目对应的数值
awk.exe/inifile.bat/inifile.awk/%2 必须在同一个文件夹中.因为这个版本的 awk 不能处理 带"\"的语句.
之所以用这个版本的awk 是因为这个版本占用内存小,速度快.

inifile.bat 内容:
@ECHO OFF
if not exist %2 goto error2

set outfile=%6
if %6*==* set outfile=initemp.txt
AWK -f inifile.awk -F= -v option=%1 top=%3 item=%4 value=%5 %2 >%outfile%
goto end

:error2
echo The file %2 is not exist!

:END
set outfile=

inifile.awk 的内容
BEGIN {
/* print "option="option,"top="top,"item="item,"value="value */
}
{
load()
if (toupper(option)=="READ")   { if (topx==1 && itemx==1) {print $2} }
if (toupper(option)=="EDIT")   { if (topx==1 && itemx==1) {print x1"="value} else {print $0} }
if (toupper(option)=="APPEND") { if (topx==1 && app!=1  ) {print $0 ;print item"="value;app=1} else { print $0 } }
}

END {}
function load() {
split($1,item1," ")
x1=item1[1]
if (x1!=NUL && substr(x1,1,1)!=";" ) {
   if (substr(x1,0,1)=="[") { if (toupper(x1)==toupper("["top"]")) { topx=1} else {topx=0}  }
   if (toupper(x1)==toupper(item)) {itemx=1} else {itemx=0}
}
}


2010.11.29 改进了一下
inifile.rar (1.08 KB, 下载次数: 74)

[ 本帖最后由 dos时代菜鸟 于 2010-11-29 16:22 编辑 ]
回复

使用道具 举报

65#
发表于 2010-11-28 23:46:43 | 只看该作者
编码规范很重要,特别是注释,一定不能嫌麻烦,隔段时间看自己的代码,经常都会半天云里雾里

awk不错,命令行下的文本输入输出处理特别给力
回复

使用道具 举报

66#
 楼主| 发表于 2010-11-29 08:54:03 | 只看该作者
原帖由 快雪时晴 于 2010-11-28 23:46 发表
编码规范很重要,特别是注释,一定不能嫌麻烦,隔段时间看自己的代码,经常都会半天云里雾里

awk不错,命令行下的文本输入输出处理特别给力


要想忽略 ini 文件中被  ";" 注释掉的 内容 只需要在 load() 中加入 && substr($1,0,1)!=";"
回复

使用道具 举报

67#
发表于 2011-9-22 01:04:09 | 只看该作者
ghost -clone,mode pdump,src=1:1,dst=1:"FNR"

如果是从U盘启动,dst=2:1 ,因为U盘被当成第一个盘,请问DOS下怎么判断硬盘被当成第几块磁盘?

点评

苍穹龙骑www.wbiquge.com/0_991/ 儒道至圣www.gmwxw.com/0_616/  发表于 2014-11-5 14:07
回复

使用道具 举报

68#
 楼主| 发表于 2011-9-22 09:13:00 | 只看该作者
可以通过 awk 自动 生成一个 bat 脚本,调用 wbat 指令 ,通过 wbat窗口交给用户选择。

可以参考 本贴 13#
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=158648&page=2#pid1866305

[ 本帖最后由 dos时代菜鸟 于 2011-9-22 09:14 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-24 09:47

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表