Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1695644
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: WINDOWS

2011-04-28 13:00:10



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 楼

九、 关于同时处理多个文件的尝试,用 GETLINE


AWK学习资料 (89.78 KB)
(32.38 KB) AWK FOR DOS
(86.97 KB)  FOR DOS
阅读(2382) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~