|  | 
 
| 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 编辑 ]
 | 
 |