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