awk单行脚本快速参考实例教程

上传人:ji****72 文档编号:46414201 上传时间:2018-06-26 格式:PDF 页数:7 大小:333.47KB
返回 下载 相关 举报
awk单行脚本快速参考实例教程_第1页
第1页 / 共7页
awk单行脚本快速参考实例教程_第2页
第2页 / 共7页
awk单行脚本快速参考实例教程_第3页
第3页 / 共7页
awk单行脚本快速参考实例教程_第4页
第4页 / 共7页
awk单行脚本快速参考实例教程_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《awk单行脚本快速参考实例教程》由会员分享,可在线阅读,更多相关《awk单行脚本快速参考实例教程(7页珍藏版)》请在金锄头文库上搜索。

1、用法: Unix: awk /pattern/ print “$1“ # 标准 Unix shell 环境 DOS/Win: awk /pattern/ print “$1“ # DJGPP 可编译通过 awk “/pattern/ print “$1“ # GnuWin32,UnxUtils,Mingw 环境 需要特别注意的是,DJGPP 编译器可以允许 awk 脚本使用 Unix 的引号语法 /like/ “this“。但是,用户必须知道在 DOS/Windows 环境下,使用 CMD.EXE 或者 COMMAND.COM 程序的话,单引号并不能保护重定向符号()和管道(|) 。 如果使用

2、双引号的话,在 DOS/CMD 命令解释器下的特殊符号和他们的特殊含义都 会被忽略。如果你的命令提示符是 bash、ksh 或者其他的 Unix 终端,单引号和双引号 会沿用 Unix 标准的用法。 同样,DOS/Win 用户必须记住用,百分号(%)用来标记 DOS/Win 环境变量, 如果想要在 awk 使用的话,需要使用双百分号(%)来表示一个百分号%。 如果我能确定一个脚本不需要被指出是使用在 Unix, DOS 或者 CMD 环境下,我通常 会省略引号。如果一个例子是 GNU awk 所特有的,将会用 gawk命令来代替。如 果你发现错误或者新的命令想要添加到这个列表里(总长度控制在

3、65 个字符一下) ,请通知我。首先我经常会尝试去写一个最短字符的脚本。为了省空间,我通常使用 1来代替print去打印每行,两种写法都能正确运行。 文本间隔: # 每行后面增加一行空行 awk 1;print “ awk BEGINORS=“nn“;1 # 每行后面增加一行空行。输出文件不会包含连续的两个或两个以上的空行 # 注意:在 Unix 系统, DOS 行包括的 CRLF (rn) 通常会被作为非空行对待 # 因此 NF 将会返回 TRUE。 awk NFprint $0 “n“ # 每行后面增加两行空行 awk 1;print “n“ 编号和计算: # 以文件为单位,在每句行前加上

4、编号 (左对齐) # 使用制表符 (t) 来代替空格可以有效保护页变的空白。 awk print FNR “t“ $0 files* # 用制表符 (t) 给所有文件加上连贯的编号。 awk print NR “t“ $0 files* # 以文件为单位,在每句行前加上编号 (编号在左,右对齐) # 如果在 DOS 环境下,需要写两个% awk printf(“ : %sn“, NR,$0) # 给非空白行的行加上编号 # 记得 Unix 对于 r 的处理的特殊之处。 (上面已经提到) awk NF$0=+a “ :“ $0;print awk print (NF? +a “ :“ :“) $

5、0 # 计算行数 (模拟 “wc -l“) awk ENDprint NR # 计算每行每个区域之和 awk s=0; for (i=1; i max max=$1; maxline=$0; END print max, maxline # 打印每行的列数,并在后面跟上此行内容 awk print NF “:“ $0 # 打印每行的最后一列 awk print $NF # 打印最后一行的最后一列 awk field = $NF ; END print field # 打印列数超过 4 的行 awk NF 4 # 打印最后一列大于 4 的行 awk $NF 4 构建字符串: # 构建一指定长度的

6、字符串(比如,513 个空格) awk BEGINwhile (a+outfile # 用 “tr“ 替代的方法。 tr -d r outfile # GNU tr 版本为 1.22 或者更高 # 删除每行前的空白(包括空格符和制表符) # 使所有文本左对齐 awk sub(/ t+/, “);1 # 删除每行结尾的空白(包括空格符和制表符) awk sub(/ t+$/, “);1 # 删除每行开头和结尾的所有空白(包括空格符和制表符) awk gsub(/ t+| t+$/,“);1 awk $1=$1;1 # 每列之间的空白也被删除 # 在每一行开头处插入5个空格 (做整页的左位移) a

7、wk sub(/, “ “);1 # 用79个字符为宽度,将全部文本右对齐 awk printf “ysn“, $0 file* # 用79个字符为宽度,将全部文本居中对齐 awk l=length();s=int(79-l)/2); printf “%“(s+l)“sn“,$0 file* # 每行用 “bar“ 查找替换 “foo“ awk sub(/foo/,“bar“); 1 # 仅仅替换第一个找到的“foo“ gawk $0=gensub(/foo/,“bar“,4); 1 # 仅仅替换第四个找到的“foo“ awk gsub(/foo/,“bar“); 1 # 全部替换 # 在包含

8、 “baz“ 的行里,将 “foo“ 替换为 “bar“ awk /baz/gsub(/foo/, “bar“); 1 # 在不包含 “baz“ 的行里,将 “foo“ 替换为 “bar“ awk !/baz/gsub(/foo/, “bar“); 1 # 将 “scarlet“ 或者 “ruby“ 或者 “puce“ 替换为 “red“ awk gsub(/scarlet|ruby|puce/, “red“); 1 # 倒排文本 (模拟 “tac“) awk ai+=$0 END for (j=i-1; j=0;) print aj- file* # 如果一行结尾为反斜线符,将下一行接到这行

9、后面 # (如果有连续多行后面带反斜线符,将会失败) awk /$/ sub(/$/,“); getline t; print $0 t; next; 1 file* # 排序并打印所有登录用户的姓名 awk -F “:“ print $1 | “sort“ /etc/passwd # 以相反的顺序打印出每行的前两列 awk print $2, $1 file # 调换前两列的位置 awk temp = $1; $1 = $2; $2 = temp file # 打印每行,并删除第二列 awk $2 = “; print # 倒置每行并打印 awk for (i=NF; i0; i-) pri

10、ntf(“%s “,i);printf (“n“) file # 用逗号链接每5行 awk ORS=NR%5?“,“:“n“ file 选择性的打印某些行: # 打印文件的前十行 (模拟 “head“) awk NR 1exit;1 # 打印文件的最后两行 (模拟 “tail -2“) awk y=x “n“ $0; x=$0;ENDprint y # 打印文件的最后一行 (模拟 “tail -1“) awk ENDprint # 打印匹配正则表达式的行 (模拟 “grep“) awk /regex/ # 打印不匹配正则表达式的行 (模拟 “grep -v“) awk !/regex/ # 打

11、印第5列等于“abc123“的行 awk $5 = “abc123“ # 打印第5列不等于“abc123“的行 # 这个同样可以用于打印少于5列的行 awk $5 != “abc123“ awk !($5 = “abc123“) # 用正则匹配某一列 awk $7 /a-f/ # 打印第7列匹配的行 awk $7 ! /a-f/ # 打印第7列不匹配的行 # 打印匹配正则表达式的前一行,但是不打印当前行 awk /regex/print x;x=$0 awk /regex/print (x=“ ? “match on line 1“ : x);x=$0 # 打印匹配正则表达式的后一行,但是不打

12、印当前行 awk /regex/getline;print # 以任何顺序查找包含 AAA、BBB 和 CCC 的行 awk /AAA/; /BBB/; /CCC/ # 以指定顺序查找包含 AAA、BBB 和 CCC 的行 awk /AAA.*BBB.*CCC/ # 打印长度大于64个字节的行 awk length 64 # 打印长度小于64个字节的行 awk length 64 # 打印从匹配正则起到文件末尾的内容 awk /regex/,0 awk /regex/,EOF # 打印指定行之间的内容 (8-12行, 包括第8和第12行) awk NR=8,NR=12 # 打印第52行 awk

13、 NR=52 awk NR=52 print;exit # 对于大文件更有效率 # 打印两个正则匹配间的内容 (包括正则的内容) awk /Iowa/,/Montana/ # 大小写敏感 选择性的删除某些行: # 删除所有空白行 (类似于 “grep . “) awk NF awk /./ # 删除重复连续的行 (模拟 “uniq“) awk a ! $0; a=$0 # 删除重复的、非连续的行 awk ! a$0+ # 最简练 awk !($0 in a) a$0;print # 最有效 致谢: 特别感谢 Peter S. Tillier 帮助我完成了一版的FAQ。同样感谢Daniel Ja

14、na、 董一粟和其他提出建议和修正的人。 更多的语法指令,包括用文件脚本来使用awk,可以参考如下: “sed & awk, 2nd Edition,“ by Dale Dougherty and Arnold Robbins OReilly, 1997 “UNIX Text Processing,“ by Dale Dougherty and Tim OReilly Hayden Books, 1987 “GAWK: Effective awk Programming,“ 3d edition, by Arnold D. Robbins (OReilly, 2003) 或者网址 http:/www.gnu.org/software/gawk/manual/ 为了能开发awk的强大功能,开发人员必须知道 “正则表达式“。关于正则 的详细讨论,可以查看 “Mastering Regular Expressions, 3d edition“ by Jeffrey Friedl (OReilly, 2006). 在Unix系统下info和帮助手册(“man“)会非常有帮助(尝试使用“man awk“、 “man nawk“、“man gawk“、“man regexp“或者“man ed“里面的正则表

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号