无忧启动论坛

标题: awk for dos 的简单应用(awk实例) [打印本页]

作者: dos时代菜鸟    时间: 2010-1-8 08:54
标题: awk for dos 的简单应用(awk实例)
awk for dos 是用于在dos下处理文本文件或者文本流的工具软件.
awk的语法:
awk '筛选条件 {命令1;命令2;命令3.....}' 文本文件名
其中"筛选条件"和{}不能同时缺省.
举例:
disk1.txt的内容,通过gdisk 1 >disk1.txt 获得
Disk  Partitions  Cylinders  Heads  Sectors  Mbytes  Model
  1        6         5169     240      63   38166.7  ST340016A
Partition  Status   Type     Volume Label   Mbytes   System   Usage
C:  1        A    PRIMARY                  8809.0  FAT32      23%
     2             EXTENDED                26686.1             70%
D:  3             LOGICAL                 10919.1  FAT32      29%
     4             LOGICAL                  9985.7  NTFS/HPFS  26%
E:  5             LOGICAL                  5781.2  FAT32      15%
     6             PRIMARY    RESTORE       2666.6  DIAGNOSTIC  7%

一、逐行显示 disk1.txt 中的内容
命令1:type disk1.txt|awk '{print $0}'
用type命令把disk1.txt显示给awk处理(更流行的说法是:用type命令把disk1.txt以一个
文本流的方式传递给awk),awk把传递过来的文本流进行分析处理逐行输出.
另一种简单的写法:
命令2:awk '{print $0}' disk1.txt
用awk直接处理disk1.txt,逐行显示
这里只是举例说明awk对文本文件和文本流的处理.
其实要达到这个逐行显示的目的只需要type disk1.txt 就可以了.
二、显示ghost用的全部分区编号\类型\百分比
awk '/LOG/;/PRI/' DISK1.TXT|AWK '{N+=1;print "1:"N,substr($0,20,3),substr($0,64,4)}'
命令包含一个管道"|",执行两个awk命令。
1.awk分析disk1.txt 内容,筛选出包含"LOG"和"PRI"的行输出
2.用awk逐行处理 "|" 传送过来的文本流,每处理一行n就增加1,同时显示"1:"和n的值,
以及该行第20,21,22三个位置的字符,该行第64,65,66,67四个位置的字符.

三、获得ghost用的最后一个硬盘分区编号
命令1.  awk '/LOG/;/PRI/' DISK1.TXT|AWK '{N+=1} END {print "1:"N}'
命令2.  awk '/LOG/;/PRI/' DISK1.TXT|AWK 'END {print "1:"FNR}'
awk分析disk1.txt 内容,筛选出包含"LOG"和"PRI"的行输出;用awk逐行处理 "|" 传送过来的文本流,最后显示"1:"和文本流总行数.


四、获得ghost用的最后一个主引导分区编号
awk '/LOG/;/PRI/' DISK1.TXT|AWK '{N+=1;print "1:"N,substr($0,20,3)}'|awk '/PRI/ {p=$1} END {print p}'

五、关于\ 和 [
awk 不能通过 print 输出"[" ,但是可以通过 printf "%%c%,91 的方式输出"[",也就是用printf以ASCII码的方式输出字符,这样我们就可以用AWK 生成 WBAT需要的菜单了。具体例子看 13 楼
ghost命令中有用到 "\",而,AWK 也不能通过 print 输出 "\",但,我们可以用同样方法输出成一个ghost命令到bat,然后运行这个bat。
比如:
gdisk 1|awk '/PRIMARY/;/LOGICA/' |AWK 'END {printf "ghost -clone,mode pdump,src=1:1,dst=1:"FNR":";printf "%%c",92;printf "System.gho -z5 -fx -sure"}'>G.BAT
得到的 G.BAT 就是你所需要的脚本。g.bat用于让ghost把镜像备份到最后一个分区。
就是用awk 分析gdisk 得到的第一硬盘分区信息并获得分区总个数,并生成对应的备份脚本g.bat。
其中 "FNR" 是AWK内置变量,用于表示文本流的总行数。

六、awk 的脚本支持(没有简单编程基础的可以不看)
对于比较复杂的awk调用,为了减少单行命令长度往往需要脚本的支持,就像dos下调用多个dos命令的时候我们常常编辑bat脚本一样。
语法: awk -f 脚本名 文本文件名  
比如:awk -f lastp.awk disk1.txt 表示用awk 调用脚本 lastp.awk 分析文本文件disk1.txt。
lastp.awk 内容如下:
BEGIN {print "获取硬盘有效分区信息及最后分区编号"}
{
if (substr($0,20,3)=="LOG") par($0);
if (substr($0,20,3)=="PRI") par($0)
}
END {print "";print "The last partition is 1:"n}


function par(partition) {
n+=1;print "1:"n,partition
}

脚本包括一个主程序和一个function(函数),功能是:显示disk1.txt 中的所有逻辑分区和主引导分区,并最终得出最后一个用于ghost的分区编号。
函数 par 的作用:接收一个变量(partition),每运行一次 par 函数就把全局变量 n 增加1,同时显示 "1:" 和n的值,以及显示接收过来的变量 partition 的内容;

主程序的作用:逐行分析文本流内容,如果该行的第20,21,22三个字符为"LOG"或者"PRI" 都要调用一次 PAR 函数,最后显示 "The last partition is 1:" 以及全局变量n 的值。
七、复杂一些的脚本
运行如下两句话实现格式化第一硬盘中c:盘以外的所有分区包括ntfs分区
gdisk 1|awk -f gdf.awk
gdisk 1 /batch:gdf.txt
-----gdf.awk---负责生成一个供gdisk调用的脚本
BEGIN {system("echo.>gdf.txt")}
{
if ($1!="C:") {
    if (substr($0,20,3)=="PRI") gdf("PRI")
    if (substr($0,20,3)=="LOG") gdf("LOG")
}
}
END {}

function gdf(p) {
        if (substr($0,5,1)==" ") {n=substr($0,6,1)} else {n=substr($0,5,2)}
        if (index($(NF-1),"NTFS")!=0)  {NTFS="/NTFS"} else {NTFS=""}
        system("echo /del /p:"n" /y >>gdf.txt" )
        system("echo /cre /"p" /for /q "NTFS" /y >>gdf.txt" )
        if (substr($0,15,1)=="A")  system("echo /act /p:"n" /y >>gdf.txt")
        }

-----------------------
1.把运行 "gdisk 1“ 获取的第一硬盘分区信息以文本流方式传递给awk , awk调用脚本文件gdf.awk对传递过来的文本流进行分析,生成gdf.txt 文件用与gdisk调用。gdf.txt 包含了逐一删除、创建、格式化、激活各个分区的gdisk指令。
2、gdisk 调用gdf.txt 对第一硬盘各分区进行格式化处理。
awk脚本解说看12楼

八、纯dos下实现 身份证号码所在地查询 具体看 16 楼

九、http://bbs.wuyou.net/forum.php?mod=viewthread&tid=158648&page=7#pid2025840 关于同时处理多个文件的尝试,用 GETLINE


AWK学习资料 awk_cai.rar (89.78 KB, 下载次数: 643)
awk.rar (32.38 KB, 下载次数: 714) AWK FOR DOS
gawk.rar (86.97 KB)  FOR DOS

[ 本帖最后由 dos时代菜鸟 于 2010-8-24 12:54 编辑 ]
作者: 不才    时间: 2010-1-8 09:30
嘿嘿,谢谢dos时代菜鸟兄的教程及所共享的软件!
作者: userwuyou    时间: 2010-1-8 09:48
请问楼主,这个软件和string(也是文本处理工具,猫似用法和这个一样) 有什么区别吗?
另外,问一下,这么复杂的东东,我们为什么不用edit.exe?
作者: dos时代菜鸟    时间: 2010-1-8 09:58
原帖由 userwuyou 于 2010-1-8 09:48 发表
请问楼主,这个软件和string(也是文本处理工具,猫似用法和这个一样) 有什么区别吗?
另外,问一下,这么复杂的东东,我们为什么不用edit.exe?

1、AWK 比STRINGS 更强大,用STRINGS 只能处理单一的一句文本条,而AWK可以处理成块的文本流。
     用STRINGS 处理文本,就必须在BAT里面制作 GOTO 循环,来处理文本中的每一条语句;而AWK就像XP下CMD中的FOR指令,可以自行处理整个文本流中的各文本条。
   你用STRINGS 设计一个可以自动分析硬盘分区信息并把第一分区备份到最后一个分区的脚本出来,再看看代码量就知道了。估计这里可能还需要用到FIND/NSET等辅助软件联合完成。
2、你能用EDIT 自动分析文本并筛选出需要的数据或者自动编辑出想要的脚本么?
你总不能在脚本每每运行到一半的时候,都要用户进入EDIT,然后根据需要编辑几条命令吧,如果用户明白命令的写法还可以,如果这个用户是个电脑盲怎么办?

[ 本帖最后由 dos时代菜鸟 于 2010-1-8 10:09 编辑 ]
作者: dlwfdlikuan    时间: 2010-1-8 10:33
楼主真是高人,不逊于葛明阳啊!
作者: dos时代菜鸟    时间: 2010-1-8 10:35
原帖由 dlwfdlikuan 于 2010-1-8 10:33 发表
楼主真是高人,不逊于葛明阳啊!


可不能这么说,我也就是在DOS下编辑一些脚本而已。
作者: 紫狐    时间: 2010-1-8 20:49
看来awk很强大,dos时代菜鸟,有没有这个软件的详细使用方法?
作者: 坏小子    时间: 2010-1-8 21:21
看来linux下的东东越来越多用于DOs中了!!!恭喜啊%
作者: dos时代菜鸟    时间: 2010-1-9 09:06
awk 还支持脚本调用。
作者: dos时代菜鸟    时间: 2010-1-9 09:25
原帖由 紫狐 于 2010-1-8 20:49 发表
看来awk很强大,dos时代菜鸟,有没有这个软件的详细使用方法?


有啊,看顶楼,已经从 dos-cn 那里弄到了一些
作者: dos时代菜鸟    时间: 2010-1-11 12:09
通过数组实现罗列英文文本中所有单词的出现次数
awk脚本
---------word.awk
{for (i=1;i<NF;i++) fields[$i]++}
END {    for (l in fields) print l,";",fields[l]    }
---------
运行 awk -f word.awk abc.txt 表示罗列 abc.txt 里面全部单词的出现次数。

通过此方法针对disk1.txt 可获得主引导分区和逻辑分区的个数
---------word.awk内容:
{for (i=1;i<NF;i++) fields[$i]++}
END { print "主="fields["PRIMARY"],"逻辑="fields["LOGICAL"]}
----------
AWK -f word.awk disk1.txt

[ 本帖最后由 dos时代菜鸟 于 2010-1-11 12:23 编辑 ]
作者: dos时代菜鸟    时间: 2010-1-11 14:27
运行如下两句话实现格式化第一硬盘中c:盘以外的所有分区包括ntfs分区
gdisk 1|awk -f gdf.awk
gdisk 1 /batch:gdf.txt
-----gdf.awk---负责生成一个供gdisk调用的脚本
BEGIN {system("echo.>gdf.txt")}
{
if ($1!="C:") {
    if (substr($0,20,3)=="PRI") gdf("PRI")
    if (substr($0,20,3)=="LOG") gdf("LOG")
}
}
END {}
function gdf(p) {
        if (substr($0,5,1)==" ") {n=substr($0,6,1)} else {n=substr($0,5,2)}
        if (index($(NF-1),"NTFS")!=0)  {NTFS="/NTFS"} else {NTFS=""}
        system("echo /del /p:"n" /y >>gdf.txt" )
        system("echo /cre /"p" /for /q "NTFS" /y >>gdf.txt" )
        if (substr($0,15,1)=="A")  system("echo /act /p:"n" /y >>gdf.txt")
        }
-----------------------

1.把运行 "gdisk 1“ 获取的第一硬盘分区信息以文本流方式传递给awk , awk调用脚本文件gdf.awk对传递过来的文本流进行分析,生成gdf.txt 文件用与gdisk调用。gdf.txt 包含了逐一删除、创建、格式化、激活各个分区的gdisk指令。
2、gdisk 调用gdf.txt 对第一硬盘各分区进行格式化处理。

---------脚本分析--------------------
1、如果分区盘符不是C:而且该分区是主分区或者逻辑分区都调用gdf函数
2、gdf函数:
如果记录的第五个字符是空格说明分区序号是一位数字,变量n取该记录的第6个字符,否则取该记录的第5,6两个字符;
如果记录的倒数第二个子段中包含"NTFS" 字样,说明该分区是NTFS格式设置变量NTFS内容是"/NTFS",否则NTFS为空;
通过system函数 调用dos指令 echo 向gdf.txt 中输入一条gdisk指令,用于删除该记录涉及的分区;
通过system函数 调用dos指令 echo 向gdf.txt 中输入一条gdisk指令,用于创建、格式化该记录涉及的分区;
如果该记录的第15个字符是"A",说明该分区激活,通过system函数 调用dos指令 echo 向gdf.txt 中输入一条gdisk指令,用于激活该记录涉及的分区。

[ 本帖最后由 dos时代菜鸟 于 2010-1-11 14:39 编辑 ]
作者: dos时代菜鸟    时间: 2010-1-11 17:56
利用awk 分析 gdisk获取的硬盘信息,生成wbat调用的菜单,给用户交互模式选择一个硬盘分区。纯dos下运行d.bat即可获得效果。
涉及软件:gdisk(EN)/wbat/awk   脚本 d.rar (831 Bytes, 下载次数: 150)
1、-----------------------d.bat-----------
@echo off
if *%1*==*a*  goto 1
cls
ECHO 正在获取硬盘数量....
gdisk |awk '{for (i=1;i!=10;i++) if ($1~i) print $1}' >TEMPd1.txt
if exist part.txt del part.txt
echo :part "选择硬盘分区"[x]>part.txt
echo 编号,盘符,状态,类型,卷标,容量,格式 >>part.txt
awk '{system("call d.bat a "$1)}' TEMPd1.txt
goto menu
:1
SET D=%2
echo 正在分析HD%D%
gdisk %D%>%d%
awk -f d1.awk %d% >>part.txt
IF EXIST %D% del %d%
SET D=
goto end1
:menu
if exist tempd1.txt del TEMPd1.txt
if not exist part.txt goto end1
awk 'END {print "set dn="FNR}' part.txt >set_dn.bat
call set_dn.bat
del set_dn.bat
if *%dn%*==*2* goto error1
:2
cls
call w.bat box @part.txt:part
if errorlevel 100 goto error0
goto 答案
:error0
echo 用户放弃了选择!
goto end2
:答案
awk 'NR==(%?%+2) {n=length($1)-2;print "用户选择了 " substr($1,2,n)}' part.txt
:end2
set wbat=
set ?=
goto end1
:error1
echo 没有适合操作的硬盘或分区!

:end1
set dn=
---------------------
2、---------------d1.awk--------------
BEGIN {}
{
  if (substr($0,20,3)=="PRI") p("PRI")
  if (substr($0,20,3)=="LOG") p("LOG")
}
END {}
function p(p) {
        n=n+1
        printf "%c",91;print FILENAME":"n"]",substr($0,2,2),substr($0,15)
}

3、自动生成的菜单如图:


---------------------------------------------------------------------------
d.bat的简单解说:
1、用gdisk配合awk获取硬盘编号列表文件 tempd1.txt 包含1,2,3,4。。。。。;
1.5、用echo 生成wbat调用的菜单文件 part.txt 的头部(2行内容);
2、利用awk 分析tempd1.txt 逐行执行d.bat中的 :1 段代码,把每一个硬盘的分区信息信息分别保存为以该硬盘编号为名字的文件中;
2.5、用awk分析硬盘分区信息,把可用信息改造成wbat菜单用的条目并追加给part.txt;
3、用awk 获取 part.txt行数,并生成set_dn.bat ,用于把part.txt行数设置给系统变量dn。如果dn=2 说明没有可用分区就跳转到 :eror1段;
4、用w.bat 调用 part.txt ,显示菜单供用户选择。

:1 段代码可以简化成如下内容而不要d1.awk 脚本
:1
SET D=%2
echo 正在分析HD%D%
gdisk %D%|awk '/LOG/;/PRI/'|AWK '{n=n+1;printf "%%c",91;print %D%":"n"]",substr($0,2,2),substr($0,15)}' >>part.txt
SET D=
goto end1

d1.awk的内容解释可参看顶楼。

[ 本帖最后由 dos时代菜鸟 于 2010-1-11 20:13 编辑 ]
作者: lianjiang    时间: 2010-1-11 18:12
此贴很好很强大,不顶不行。
作者: fightx    时间: 2010-1-12 07:09
呵呵 有点难度 谢谢分享!!!
作者: dos时代菜鸟    时间: 2010-1-12 09:29
纯dos下实现身份证所在地查询
需要软件:awk/wbat 以及一个文本数据库date.txt
脚本及date.txt sfz.rar (21.71 KB, 下载次数: 119)
--------------sfz2.bat-------------------------
@echo off
echo :sfz "身份证所在地查询"[x]>sfz.mnu
echo ------------------------------------------>>sfz.mnu
echo      请输入身份证号码前6位:[$d,6,!U]>>sfz.mnu
echo ------------------------------------------>>sfz.mnu
echo      [&o.确定]             [&x.取消]>>sfz.mnu

set d=110101
:top
call w.bat box @sfz.mnu:sfz
if errorlevel 100 goto end
if errorlevel 2 goto end
set dr=
awk '$1=="%d%" {print "set dr="$2" "$3" "$4}' date.txt>set_dr.bat
call  set_dr.bat
del set_dr.bat
set ok=%d% 对应的中国地域为:
if *%dr%*==** set ok=数据库没有 %d% 相关信息!
wbat box "%ok%^%dr%" ,&o.继续,&x.退出
if errorlevel 100 goto end
if errorlevel 2 goto end
goto top

:end
for %%c in (ok wbat ? d dr) do set %%c=
if exist sfz.mnu del sfz.mnu

-------------------------------------------
1、利用bat生成wbat调用的菜单
2、wbat调用菜单要求用户输入身份证前6位
3、awk 根据用户输入信息搜索 数据库,找出对应的信息并用wbat显示出来

date.txt 文件结果类似如下:
130102 河北省 石家庄市 长安区
130103 河北省 石家庄市 桥东区
130104 河北省 石家庄市 桥西区
130105 河北省 石家庄市 新华区
130107 河北省 石家庄市 井陉矿区
130108 河北省 石家庄市 裕华区
----------------------------------------------------------------------------
其实如下命令把地址内容赋予给变量dr可以用 nset +type +find 达到。
awk '$1=="%d%" {print "set dr="$2" "$3" "$4}' date.txt>set_dr.bat
call  set_dr.bat
del set_dr.bat

-------nset+type+find
type date.txt|find /i  /n "%d% |nset /S] n=$1
echo %n%|nset /S[ n2=$1
set n=
type date.txt |nset /l%n2% dr=$2$3$4
set n2=
用 find 找出行号,然后用nset 获取指定行内容,筛选出有用信息赋值给变量dr


[ 本帖最后由 dos时代菜鸟 于 2010-1-12 10:22 编辑 ]
作者: lianjiang    时间: 2010-1-12 10:44
谁把这个帖子研究透了,awk的使用应就无敌了。

awk gawk文章收集
http://www.cn-dos.net/forum/view ... ge=1&highlight=
作者: dos时代菜鸟    时间: 2010-1-12 10:55
原帖由 lianjiang 于 2010-1-12 10:44 发表
谁把这个帖子研究透了,awk的使用应就无敌了。

awk gawk文章收集
http://www.cn-dos.net/forum/viewthread.php?tid=24225&fpage=1&highlight=


看一楼 学习资料 就是这些东西。呵呵
但,对于dos下,还是需要不断摸索,总结经验。
比如:
dos下命令行方式执行awk指令可以带dos变量比如: %D%,而awk脚本中就不行
dos命令行下awk无法运行(1+2)*3这样的乘法算式,而awk脚本中就可以。好在dos命令行下的除法可以用,呵呵。
比如:
echo.|awk '{print (2+3)*5}'  这样的句子就执行不了,而换成 echo.|awk '{print (2+3)/(1/5)}' 就能执行了。这或许是因为 * 在dos中是通配符的原因吧。

再比如:dos下的<和 >都有特殊用途,这样在命令行下如果用 >或者< 表示大于... 和 小于...来应用的for或者if语句中就不行了。
如13楼中 gdisk |awk '{for (i=1;i!=10;i++) if ($1~i) print $1}' >TEMPd1.txt 一句本来应该
gdisk |awk '{for (i=1;i<=10;i++) if ($1~i) print $1}' >TEMPd1.txt 但因为dos命令行下直接运行,只好把"<=9" 改成"!=10"

[ 本帖最后由 dos时代菜鸟 于 2010-1-12 11:15 编辑 ]
作者: lianjiang    时间: 2010-1-12 11:15
原帖由 dos时代菜鸟 于 2010-1-12 10:55 发表


看一楼 学习资料 就是这些东西。呵呵
但,对于dos下,还是需要不断摸索,总结经验。
比如:
比如:
echo.|awk '{print (2+3)*5}'  这样的句子就执行不了,而换成 echo.|awk '{print (2+3)/(1/5)}' 就能执行了。


没注意一楼就有了那些资料。 有那些东西,也就全了。
剩下的就是实践了。
不同版本在命令格式上有差别,这是正常的。
这只有在实践中摸索总结了。
我用的版本,执行echo.|awk '{print (2+3)*5}' 是没问题的。


作者: dos时代菜鸟    时间: 2010-1-12 11:17
原帖由 lianjiang 于 2010-1-12 11:15 发表


没注意一楼就有了那些资料。 有那些东西,也就全了。
剩下的就是实践了。
不同版本在命令格式上有差别,这是正常的。
这只有在实践中摸索总结了。
我用的版本,执行echo.|awk '{print (2+3)*5}' 是没问 ...


gawk for 纯dos 么?来一个,品尝一下啊。
作者: lianjiang    时间: 2010-1-12 11:20
原帖由 dos时代菜鸟 于 2010-1-12 11:17 发表


gawk for 纯dos 么?来一个,品尝一下啊。


dos版gawk。

gawk.rar

86.97 KB, 下载次数: 656, 下载积分: 无忧币 -2

dos版gawk


作者: dos时代菜鸟    时间: 2010-1-12 12:44
原帖由 lianjiang 于 2010-1-12 11:20 发表


dos版gawk。


2.15 版本的,不错。多谢。
作者: lianjiang    时间: 2010-1-12 13:08
当时也是看到了dos联盟的那个帖子,有了一点试试的兴趣,网上到处找dos版,结果基本上都属无功而返。呵呵。
dos版很难找。
作者: dos时代菜鸟    时间: 2010-1-12 13:38
原帖由 lianjiang 于 2010-1-12 13:08 发表
当时也是看到了dos联盟的那个帖子,有了一点试试的兴趣,网上到处找dos版,结果基本上都属无功而返。呵呵。
dos版很难找。


刚才进行品尝了一下这个gawk,发现可能是因为体积的问题,无法在内存装载两个gawk.exe 导致 13 楼 那个脚本中 awk '{system("call d.bat a "$1 )}' tempd1.txt 的命令无法完成。

需要修改脚本,刚修改了内容如下:
------------d.bat 内容:
@echo off
cls
ECHO 正在获取硬盘个数....
gdisk |gawk '{for (i=1;i!=10;i++) if ($1~i) print $1}' >TEMPd1.txt
echo :part "选择硬盘分区"[x]>part.txt
echo 编号,盘符,状态,类型,卷标,容量,格式 >>part.txt
echo @echo off >d1.bat
gawk -f d.awk TEMPd1.txt >>d1.bat
call d1.bat
if exist d1.bat del d1.bat
if exist tempd1.txt del TEMPd1.txt
if not exist part.txt goto end1

:menu
gawk 'END {print "set dn="FNR}' part.txt >set_dn.bat
call set_dn.bat
del set_dn.bat
if *%dn%*==*2* goto error1
:2
cls
call w.bat box @part.txt:part
if errorlevel 100 goto error0
goto 答案
:error0
echo 用户放弃了选择!
goto end2
:答案
gawk 'NR==(%?%+2) {n=length($1)-2;print "用户选择了 " substr($1,2,n)}' part.txt
:end2
FOR %%c IN (wbat ?) do SET %%c=
GOto end1

:error1
echo 没有适合操作的硬盘或分区!

:end1
set dn=
if exist part.txt del part.txt

------------------d.awk内容(输出信息将传递给d1.bat)
BEGIN {}
{
  print "echo 正在分析HD"$1
  printf "gdisk "$1" "
  printf "%c",124
  printf "gawk -f d1.awk -v d="$1
  printf "%c%c",62,62;print "part.txt"
}
END {}

---------------------------------d1.awk 内容(输出信息将传递给part.txt)
BEGIN {}
{
  if ((substr($0,20,3)=="PRI")  || (substr($0,20,3)=="LOG") ) {

        n=n+1
        printf "%c",91;print d":"n"]",substr($0,2,2),substr($0,15)

     }
}
END {}


1、获取硬盘个数生成tempd1.txt
2、根据tempd1.txt 生成一个可以逐一获取各硬盘分区信息并将可用信息转化成wbat菜单条目追加到part.txt 的脚本 d1.bat
    d1.bat 包涵的命令大致是:gdisk 1 | awk -f d1.awk -v d=1 >>part.txt  如果有多个硬盘,d1.bat中会有多条这样的命令.
3、运行d1.bat 把信息追加到part.txt中
4、用wbat 调用part.txt

其中:printf "%c",62 表示输出一个">" ;printf "%c",124 表示输出一个"|"

[ 本帖最后由 dos时代菜鸟 于 2010-1-12 18:10 编辑 ]
作者: wmjm    时间: 2010-1-12 15:41
不知道能否自动搜索和替换文本内容,下一个收藏。
作者: dos时代菜鸟    时间: 2010-1-12 15:49
原帖由 wmjm 于 2010-1-12 15:41 发表
不知道能否自动搜索和替换文本内容,下一个收藏。


给个题目让我看看。
作者: oym2007    时间: 2010-1-12 16:25
学习了的确好用,谢谢
awk '/Key/ {print $2}' ghststat.txt|awk '/1:/ {p=$1} END {print p}|nset bakp=$1 一句就能找到最后盘符
作者: yjd    时间: 2010-1-12 16:44
一看标题以为是linux下的awk^_^
作者: dos时代菜鸟    时间: 2010-1-12 17:28
想起n年前曾经盛行一时的 foxbase+ DBASEIII 等等数据库处理语言的祖宗来,也是用c语言编辑的。很类似。
作者: dos时代菜鸟    时间: 2010-1-12 17:29
原帖由 oym2007 于 2010-1-12 16:25 发表
学习了的确好用,谢谢
awk '/Key/ {print $2}' ghststat.txt|awk '/1:/ {p=$1} END {print p}|nset bakp=$1 一句就能找到最后盘符


终于有人反馈使用感受了。
作者: lianjiang    时间: 2010-1-12 18:33
gawk初级应用

初试gawk,发现太强大了。确定硬盘最后分区,一行搞定。[08.01.17]
http://bbs.wuyou.net/forum.php?m ... tra=&highlight=


抛砖引玉:利用ghost的ghststat.txt确定活动分区及最后有效分区的方法 [09.06.19]
http://bbs.wuyou.net/forum.php?m ... ghlight=&page=1
作者: dos时代菜鸟    时间: 2010-1-12 18:51
原帖由 oym2007 于 2010-1-12 16:25 发表
学习了的确好用,谢谢
awk '/Key/ {print $2}' ghststat.txt|awk '/1:/ {p=$1} END {print p}|nset bakp=$1 一句就能找到最后盘符


刚测试,发现这句话有个漏洞,就是,如果有多个硬盘,可能会把 "2.1:"  这样的条目计算进来
改用:
awk '/Key/&&/1:/ {if (substr($2,(length($2)))!=":") p=$2} END {print p}' GHSTSTAT.TXT|nset bakp=$1
应该好一些。

也可以事先编辑如下内容的脚本 g.awk
{if (($1~"Key")&&($2~"1:[1-9]")) p=$2}
END {print p}

然后运行 awk -f g.awk GHSTSTAT.TXT|nset bakp=$1

[ 本帖最后由 dos时代菜鸟 于 2010-1-12 19:25 编辑 ]
作者: lxl1638    时间: 2010-1-12 18:54
http://gnuwin32.sourceforge.net/packages/gawk.htm
作者: 快雪时晴    时间: 2010-1-12 19:29
标题: 回复 #1 dos时代菜鸟 的帖子
gawk官网下只有src,没编译器编译
http://www.gnu.org/software/gawk/gawk.html

另外
http://gnuwin32.sourceforge.net/packages/gawk.htm
只能用于WIN95以上

是否DOS下的必须自己编译?TC2能编译吗?
作者: dos时代菜鸟    时间: 2010-1-12 19:33
原帖由 快雪时晴 于 2010-1-12 19:29 发表
gawk官网下只有src,没编译器编译
http://www.gnu.org/software/gawk/gawk.html

另外
http://gnuwin32.sourceforge.net/packages/gawk.htm
只能用于WIN95以上

是否DOS下的必须自己编译?TC2能编译吗?


很久没有弄 tc 了,如果老兄能编译成功,别忘了放上来 一个。
作者: lianjiang    时间: 2010-1-12 19:38
原帖由 快雪时晴 于 2010-1-12 19:29 发表
gawk官网下只有src,没编译器编译
http://www.gnu.org/software/gawk/gawk.html

另外
http://gnuwin32.sourceforge.net/packages/gawk.htm
只能用于WIN95以上

是否DOS下的必须自己编译?TC2能编译吗?


#1,#21的都是dos版的。
作者: zxw    时间: 2010-1-12 20:07
awk似乎还用上了一些c语言的语法?
作者: 快雪时晴    时间: 2010-1-12 21:13
标题: WIN32下单引号如何处理?(已解决)
R:\>awk 'BEGIN { print "hello,world" }'
awk: 'BEGIN
awk: ^ invalid char ''' in expression



看来在WIN32下要用
AWK -f f.AWK  in.txt

形式才可以。

[ 本帖最后由 快雪时晴 于 2010-1-12 21:12 编辑 ]
作者: 快雪时晴    时间: 2010-1-12 21:55
标题: 新学awk,小试一下
点出所有的字符a
R:\>type 1.txt
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options:
        -f progfile             --file=progfile
        -F fs                   --field-separator=fs
        -v var=val              --assign=var=val
        -m[fr] val
        -W compat               --compat
        -W copyleft             --copyleft
        -W copyright            --copyright
        -W dump-variables[=file]        --dump-variables[=file]
        -W exec=file            --exec=file
        -W gen-po               --gen-po
        -W help                 --help
        -W lint[=fatal]         --lint[=fatal]
        -W lint-old             --lint-old
        -W non-decimal-data     --non-decimal-data
        -W profile[=file]       --profile[=file]
        -W posix                --posix
        -W re-interval          --re-interval
        -W source=program-text  --source=program-text
        -W traditional          --traditional
        -W usage                --usage
        -W use-lc-numeric       --use-lc-numeric
        -W version              --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
        gawk '{ sum += $1 }; END { print sum }' file
        gawk -F: '{ print $1 }' /etc/passwd




代码f.awk:
  1. BEGIN { print "hello,world===============" }
  2. {print $0}
  3. {gsub(/[^a\t]/," ");print}
  4. {gsub("a","A",$0);print}
  5. {last=$1}
  6. END {print "\nthe last is =" $1 }
复制代码
命令:
awk  -f f.awk 1.txt








hello,world===============
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
  a    a                                                         
  A    A                                                         
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
  a    a                                           a           
  A    A                                           A           
POSIX options:  GNU long options:
                                 
                                 
-f progfile  --file=progfile
                             
                             
-F fs   --field-separator=fs
                    a a      
                    A A      
........

Examples:
  a      
  A      
gawk '{ sum += $1 }; END { print sum }' file
  a                                          
  A                                          
gawk -F: '{ print $1 }' /etc/passwd
  a                            a   
  A                            A   
the last is =A



awk实在太强了,竟然有正则

[ 本帖最后由 快雪时晴 于 2010-1-12 22:02 编辑 ]
作者: 快雪时晴    时间: 2010-1-13 00:10
标题: l练手二: 取得awk帮助文件的单词数
R:\>awk "BEGIN {i=0} /\w/ {i+=NF} END {print i}" 1.txt
143210

神啊,
一个小小的exe已经实现了太多的功能,它就是一个脚本语言解释器,
越接触越觉得强大
linux下的东西就是这样,太强大了,用的人反而少了,怕呀
作者: 快雪时晴    时间: 2010-1-14 21:06
标题: 怎么让awk不要输出中间变量,太多的buffer了
R:\>echo 111.111.111.111 | awk --posix "/([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}
/"
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
111.111.111.111

我只要最后一行就可以了,怎么那么多buffer中间步骤也来了
作者: dos时代菜鸟    时间: 2010-1-15 07:09
原帖由 快雪时晴 于 2010-1-14 21:06 发表
R:\>echo 111.111.111.111 | awk --posix "/([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}
/"
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
buffer: .
111.111.11 ...


用 | 再次传递给awk 处理一次。
作者: dos时代菜鸟    时间: 2010-1-15 07:10

awk 利用ucdos特显功能实现dos下立体感官按钮


附件
2010-1-15 17:00

m.GIF (7.38 KB)
  



awk 利用ucdos 特显功能中的绘图功能实现 纯dos下立体感官按钮效果
虚拟软盘: M.part1.rar (280 KB) M.part2.rar (228.88 KB)

这下,dos下的菜单也可以像win了。
软盘中的 awk\m.bat 是批处理,m.awk 是awk的脚本。
批处理需要choice 的协助。




[ 本帖最后由 dos时代菜鸟 于 2010-1-15 17:06 编辑 ]
作者: dos时代菜鸟    时间: 2010-1-16 20:13
刚用awk调用 ucdos 特显功能 实现 我的dos工具箱 主菜单立体质感效果。呵呵
作者: lizhenduo    时间: 2010-1-18 16:50
标题: 回复 #1 dos时代菜鸟 的帖子
dos时代菜鸟
中校阁下:
我不想用通过 gdisk 获得的 disk1.txt,而用 ghost -dd 生成的 ghststat.txt,该怎样写批处理来获得最后分区和第一分区到变量(我是双硬盘),请帮忙写个现成的,谢谢啦.
还有,如果用磁盘扇区读写、分区信息管理工具 Dsptw 获得磁盘信息,又该怎样用 awk 来处理呢?
                                                                                                  谢谢

[ 本帖最后由 lizhenduo 于 2010-1-18 20:07 编辑 ]
作者: dos时代菜鸟    时间: 2010-1-19 10:54
原帖由 lizhenduo 于 2010-1-18 16:50 发表
dos时代菜鸟
中校阁下:
我不想用通过 gdisk 获得的 disk1.txt,而用 ghost -dd 生成的 ghststat.txt,该怎样写批处理来获得最后分区和第一分区到变量(我是双硬盘),请帮忙写个现成的,谢谢啦.
还有,如果用磁盘扇 ...



这些体力活,还是自己动手丰衣足食吧。要不然去看看 LINJIANG 的那个帖子。
参考32楼和27楼

需要熟悉GHSTSTAT.TXT 的文件结构和其他磁盘扇区读取工具的用法。

[ 本帖最后由 dos时代菜鸟 于 2010-1-19 11:09 编辑 ]
作者: oym2007    时间: 2010-1-19 17:14
原帖由 lizhenduo 于 2010-1-18 16:50 发表
dos时代菜鸟
中校阁下:
我不想用通过 gdisk 获得的 disk1.txt,而用 ghost -dd 生成的 ghststat.txt,该怎样写批处理来获得最后分区和第一分区到变量(我是双硬盘),请帮忙写个现成的,谢谢啦.
还有,如果用磁盘扇 ...


专机专用 直接指定就行了 如必多此一举
ghost11.5 找最后一盘符

awk '$0~ /PID_POSITION_ID:/ {p=$2} END {print p}' ghststat.txt

[ 本帖最后由 oym2007 于 2010-1-19 19:14 编辑 ]
作者: lizhenduo    时间: 2010-1-20 11:24
标题: 回复 #46 dos时代菜鸟 的帖子
谢谢,虽心有余无奈力不足.
作者: lizhenduo    时间: 2010-1-20 11:26
标题: 回复 #47 oym2007 的帖子
谢谢啦,我学习学习再报告.
作者: kfox29    时间: 2010-1-20 16:51
谢谢楼主分享
作者: dos时代菜鸟    时间: 2010-1-20 22:56
随机数的产生:
产生一个0-62之间的随机整数

srand()
x=int(rand()*62)


获得的变量 x 就是答案
1、用srand()刷新系统seed
2、rand() 产生一个>0 而且 <1 的小数
rand()*100 得到的整数位应该是一个0-100 之间的随机数
那么rand()*62 得到一个62以内的数值 再用int取整即可得到所需随机数。

如果是 20-62 之间的随机数可以用 x=int(rand()*42+20) 来获得

[ 本帖最后由 dos时代菜鸟 于 2010-1-20 23:25 编辑 ]
作者: dos时代菜鸟    时间: 2010-3-11 15:28
用 wbat+awk+nset 实现的 简单计算器
@echo off
set x=0
set n=0
:top
cls
call w.bat box @jsq.bat:menu
if errorlevel 100 goto end
set n=%x%
echo { print %x% }>jsq.awk
echo.|awk -f jsq.awk|nset x=$0
del jsq.awk
goto top

:menu "AWK 简单计算器"[x]
----------------------------------------------------
[$ x,50,!                                          ]
----------------------------------------------------
  可进行简单的四则混合运算(自动使用科学计数法)
  1 2 3 4 5 6 7 8 9 0 + - * / ( )
  sin(x)--正弦      cos(x)--余弦
  log(x)--自然对数  int(x)--取整
  sqrt(x)-取平方根  exp(x)--E的x次幂
----------------------------------------------------
%n%=%x%
:end
set x=
set n=
set ?=
set wbat=


jsq.rar (43.42 KB, 下载次数: 100)

[ 本帖最后由 dos时代菜鸟 于 2010-3-11 15:40 编辑 ]

1.JPG (31.23 KB, 下载次数: 174)

1.JPG

作者: oym2007    时间: 2010-3-11 21:28
原帖由 dos时代菜鸟 于 2010-3-11 15:28 发表
用 wbat+awk+nset 实现的 简单计算器
@echo off
set x=0
set n=0
:top
cls
call w.bat box @jsq.bat:menu
if errorlevel 100 goto end
set n=%x%
echo { print %x% }>jsq.awk
echo.|awk -f jsq.awk|n ...

楼主能不能上传个 awk或gawk win32版
作者: dos时代菜鸟    时间: 2010-3-12 08:03
原帖由 oym2007 于 2010-3-11 21:28 发表

楼主能不能上传个 awk或gawk win32版


win32 下的 gawk 到处都是。
作者: 光辉岁月    时间: 2010-3-13 17:07
看来awk很强大

谢谢
作者: oym2007    时间: 2010-3-30 13:57
原帖由 dos时代菜鸟 于 2010-3-12 08:03 发表


win32 下的 gawk 到处都是。

再请教dos下nset 可获得变量,Win下用那个?
作者: dos时代菜鸟    时间: 2010-3-30 14:15
原帖由 oym2007 于 2010-3-30 13:57 发表

再请教dos下nset 可获得变量,Win下用那个?

1、nset 在win2000 下同样可以用。
2、可以用 gawk 的print 生成一个包含 SET 命令的 CMD 脚本,然后运行该脚本。
作者: oym2007    时间: 2010-3-30 14:52
原帖由 dos时代菜鸟 于 2010-3-30 14:15 发表

1、nset 在win2000 下同样可以用。
2、可以用 gawk 的print 生成一个包含 SET 命令的 CMD 脚本,然后运行该脚本。


gawk for dos    '....{printf "....."$1}' ....

gawk for win    ".....{printf ?....?$1}".....   请赐教
作者: dos时代菜鸟    时间: 2010-3-30 15:05
1 生成一个包含 命令 SET N=15 的脚本x.cmd
echo.|gawk '{print "set n="1+2+3+4+5}' >x.cmd

2 运行X.CMD
作者: oym2007    时间: 2010-3-30 15:13
原帖由 dos时代菜鸟 于 2010-3-30 15:05 发表
1 生成一个包含 命令 SET N=15 的脚本x.cmd
echo.|gawk '{print "set n="1+2+3+4+5}' >x.cmd

2 运行X.CMD

谢了 gawk for win    gawk " printf {....} "  要使用双引号 ,在双引号内 又不能用单引号 晕

晕啊 明明 gawk --help 中的例子 是用单引号 可实际上 还是要用双引号才行 晕了

[ 本帖最后由 oym2007 于 2010-3-30 15:23 编辑 ]
作者: zhaohj    时间: 2010-4-9 08:21
dos时代菜鸟批处理写得这么好,把我请求的批处理改一下:
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D2

各位版主也帮帮忙啊!
作者: dos时代菜鸟    时间: 2010-8-24 12:31
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


作者: dos时代菜鸟    时间: 2010-8-26 13:39
利用 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 编辑 ]
作者: dos时代菜鸟    时间: 2010-11-28 17:30
用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 编辑 ]
作者: 快雪时晴    时间: 2010-11-28 23:46
编码规范很重要,特别是注释,一定不能嫌麻烦,隔段时间看自己的代码,经常都会半天云里雾里

awk不错,命令行下的文本输入输出处理特别给力
作者: dos时代菜鸟    时间: 2010-11-29 08:54
原帖由 快雪时晴 于 2010-11-28 23:46 发表
编码规范很重要,特别是注释,一定不能嫌麻烦,隔段时间看自己的代码,经常都会半天云里雾里

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


要想忽略 ini 文件中被  ";" 注释掉的 内容 只需要在 load() 中加入 && substr($1,0,1)!=";"
作者: 2011aaaaa0808    时间: 2011-9-22 01:04
ghost -clone,mode pdump,src=1:1,dst=1:"FNR"

如果是从U盘启动,dst=2:1 ,因为U盘被当成第一个盘,请问DOS下怎么判断硬盘被当成第几块磁盘?
作者: dos时代菜鸟    时间: 2011-9-22 09:13
可以通过 awk 自动 生成一个 bat 脚本,调用 wbat 指令 ,通过 wbat窗口交给用户选择。

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

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




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3