Awk

来自Shiyin's note
218.69.12.2讨论2012年4月6日 (五) 16:12的版本 →‎例子
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

基本用法

awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]

参数说明

-F re:允许awk更改其字段分隔符。默认是空格

parameter: 该参数帮助为不同的变量赋值。

'prog': awk的程序语句段。这个语句段必须用单引号 ' ' 括起,以防被shell解释。这个程序语句段的标准形式为:

'pattern {action}'

其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。与sed类似,你也可以使 用","分开两样式以选择某个范围。

你可以省略pattern和action之一,但不能两者同时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略 action时执行缺省的操作��在标准输出上显示。

awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。

在awk中,缺省的情况下总是将文本文件中的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段,awk借用 shell的方法,用$1,$2,$3...这样的方式来顺序地表示行(记录)中的不同字段。特殊地,awk用$0表示整个行(记录)。

例子

  • 显示文件中含有doc的记录
$awk '/sun/' mydoc
注:由于显示整个记录(全行)是awk的缺省动作,因此可以省略action项。
  • 显示文件myfile中的行号和第3字段:
$awk '{printf"%03d%s",NR,$1}' myfile
  • 显示文本myfile中所有超过80个字符的行号
$awk 'length($0)>80 {print NR}' myfile
注:这里用$0表示整个记录(行),同时,内置变量NR(行号)不使用标志符'$'。 length() 内置函数
  • 将竖排的数据生成横排数据
$awk '{printf("%s,",$1)}' filename > newfile
  • 将横排的数据生成竖排
$awk -F, '{i=1 ;while ( i <= NF ) {print $i;i++}}' file1 >file2
  • read from "ls *zip", seperate it with '/' and assign them to $1, $2, then mkdir $2, "|sh" make it execute.
$ls *zip |awk -F/ '{print $1, $2}' |awk '{print "mkdir "$2}' |sh
  • 显示奇偶行用awk可以这样:
$awk 'NR%2==0' file
$awk 'NR%!=0' file
  • 删除空行还可以这样
$awk 'NF>0' file