- AWK单行脚本快速参考 2008年4月28日
- 编辑: Eric Pement eric [at] pement.org 版本 0.26
- 翻译: 董一粟 yisudong [at] gmail.com
- 最新英文版本文件发布在以下地址:
- http://www.pement.org/awk/awk1line.txt
- 最新中文翻译版本文件发布在以下地址:
- http://ximix.org/translation/awk1line_zh-CN.txt
- 翻译问题欢迎联系我:
- http://hi.baidu.com/ximix/blog/item/e9334cc2204fa330e5dd3bf2.html
-
- 用法:
-
- Unix: awk '/pattern/ {print "$1"}'
- DOS/Win: awk '/pattern/ {print "$1"}'
- awk "/pattern/ {print \"$1\"}"
-
- 需要特别注意的是,DJGPP编译器可以允许awk脚本使用Unix的引号语法
- '/like/ {"this"}'。但是,用户必须知道在DOS/Windows环境下,使用CMD.EXE或者
- COMMAND.COM程序的话,单引号并不能保护重定向符号(<, >)和管道(|)。
- 如果使用双引号的话,在DOS/CMD命令解释器下的特殊符号和他们的特殊含义都
- 会被忽略。如果你的命令提示符是bash、ksh或者其他的Unix终端,单引号和双引号
- 会沿用Unix标准的用法。
-
- 同样,DOS/Win用户必须记住用,百分号(%)用来标记DOS/Win环境变量,
- 如果想要在awk使用的话,需要使用双百分号(%%)来表示一个百分号%。
-
- 如果我能确定一个脚本不需要被指出是使用在Unix, DOS或者CMD环境下,我通常
- 会省略引号。如果一个例子是GNU awk所特有的,将会用 'gawk'命令来代替。如
- 果你发现错误或者新的命令想要添加到这个列表里(总长度控制在65个字符一下)
- ,请通知我。首先我经常会尝试去写一个最短字符的脚本。为了省空间,我通常使用
- '1'来代替'{print}'去打印每行,两种写法都能正确运行。
-
- 文本间隔:
-
-
- awk '1;{print ""}'
- awk 'BEGIN{ORS="\n\n"};1'
-
-
-
-
- awk 'NF{print $0 "\n"}'
-
-
- awk '1;{print "\n"}'
-
- 编号和计算:
-
-
-
- awk '{print FNR "\t" $0}' files*
-
-
- awk '{print NR "\t" $0}' files*
-
-
-
- awk '{printf("%5d : %s\n", NR,$0)}'
-
-
-
- awk 'NF{$0=++a " :" $0};{print}'
- awk '{print (NF? ++a " :" :"") $0}'
-
-
- awk 'END{print NR}'
-
-
- awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print s}'
-
-
- awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s}'
-
-
- awk '{for (i=1; i<=NF; i++) if ($i < 0) $i = -$i; print }'
- awk '{for (i=1; i<=NF; i++) $i = ($i < 0) ? -$i : $i; print }'
-
-
- awk '{ total = total + NF }; END {print total}' file
-
-
- awk '/Beth/{n++}; END {print n+0}' file
-
-
-
- awk '$1 > max {max=$1; maxline=$0}; END{ print max, maxline}'
-
-
- awk '{ print NF ":" $0 } '
-
-
- awk '{ print $NF }'
-
-
- awk '{ field = $NF }; END{ print field }'
-
-
- awk 'NF > 4'
-
-
- awk '$NF > 4'
-
- 构建字符串:
-
-
- awk 'BEGIN{while (a++<513) s=s " "; print s}'
-
-
-
- gawk --re-interval 'BEGIN{while(a++<49)s=s " "};{sub(/^.{6}/,"&" s)};1'
-
- 构建数组:
-
-
-
-
-
- split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, " ")
-
-
-
- for (i=1; i<=12; i++) m_digit[month[i]] = i
-
- 文本转换和替代:
-
-
- awk '{sub(/\r$/,"")};1'
-
-
- awk '{sub(/$/,"\r")};1'
-
-
- awk 1
-
-
-
- gawk -v BINMODE="w" '1' infile >outfile
-
-
- tr -d \r <infile >outfile
-
-
-
- awk '{sub(/^[ \t]+/, "")};1'
-
-
- awk '{sub(/[ \t]+$/, "")};1'
-
-
- awk '{gsub(/^[ \t]+|[ \t]+$/,"")};1'
- awk '{$1=$1};1'
-
-
- awk '{sub(/^/, " ")};1'
-
-
- awk '{printf "%79s\n", $0}' file*
-
-
- awk '{l=length();s=int((79-l)/2); printf "%"(s+l)"s\n",$0}' file*
-
-
- awk '{sub(/foo/,"bar")}; 1'
- gawk '{$0=gensub(/foo/,"bar",4)}; 1'
- awk '{gsub(/foo/,"bar")}; 1'
-
-
- awk '/baz/{gsub(/foo/, "bar")}; 1'
-
-
- awk '!/baz/{gsub(/foo/, "bar")}; 1'
-
-
- awk '{gsub(/scarlet|ruby|puce/, "red")}; 1'
-
-
- awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file*
-
-
-
- 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; i>0; i--) printf("%s ",i);printf ("\n")}' file
-
-
- awk 'ORS=NR%5?",":"\n"' file
-
- 选择性的打印某些行:
-
-
- awk 'NR < 11'
-
-
- awk 'NR>1{exit};1'
-
-
- awk '{y=x "\n" $0; x=$0};END{print y}'
-
-
- awk 'END{print}'
-
-
- awk '/regex/'
-
-
- awk '!/regex/'
-
-
- awk '$5 == "abc123"'
-
-
-
- awk '$5 != "abc123"'
- awk '!($5 == "abc123")'
-
-
- awk '$7 ~ /^[a-f]/'
- awk '$7 !~ /^[a-f]/'
-
-
- awk '/regex/{print x};{x=$0}'
- awk '/regex/{print (x=="" ? "match on line 1" : x)};{x=$0}'
-
-
- awk '/regex/{getline;print}'
-
-
- awk '/AAA/; /BBB/; /CCC/'
-
-
- awk '/AAA.*BBB.*CCC/'
-
-
- awk 'length > 64'
-
-
- awk 'length < 64'
-
-
- awk '/regex/,0'
- awk '/regex/,EOF'
-
-
- awk 'NR==8,NR==12'
-
-
- awk 'NR==52'
- awk 'NR==52 {print;exit}'
-
-
- awk '/Iowa/,/Montana/'
-
- 选择性的删除某些行:
-
-
- awk NF
- awk '/./'
-
-
- awk 'a !~ $0; {a=$0}'
-
-
- awk '! a[$0]++'
- awk '!($0 in a) {a[$0];print}'
-
- 致谢:
-
- 特别感谢 Peter S. Tillier 帮助我完成了一版的FAQ。同样感谢Daniel Jana、
- 董一粟和其他提出建议和修正的人。
-
- 更多的语法指令,包括用文件脚本来使用awk,可以参考如下:
-
- "sed & awk, 2nd Edition," by Dale Dougherty and Arnold Robbins
- O'Reilly, 1997
- "UNIX Text Processing," by Dale Dougherty and Tim O'Reilly
- Hayden Books, 1987
- "GAWK: Effective awk Programming," 3d edition, by Arnold D. Robbins
- (O'Reilly, 2003) 或者网址 http://www.gnu.org/software/gawk/manual/
-
- 为了能开发awk的强大功能,开发人员必须知道 "正则表达式"。关于正则
- 的详细讨论,可以查看
- "Mastering Regular Expressions, 3d edition" by Jeffrey Friedl (O'Reilly,
- 2006).
-
- 在Unix系统下info和帮助手册("man")会非常有帮助(尝试使用"man awk"、
- "man nawk"、"man gawk"、"man regexp"或者"man ed"里面的正则表达式章节)。
-
- 在awk脚本里面使用 '\t':为了使文档变得清晰,我们在脚本里使用了表达式'\t'
- 来显示一个制表符 (0x99)。所有awk的版本,甚至UNIX系统7的版本应该能认出
- '\t'这种缩写。