AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )
格式:
awk [options] ‘script‘ file1 file2,...
awk [options] ‘PATTERN {action}‘ file1 file2,...
print,printf
awk的输出:
一、print
print的使用格式:
print item1,item2,...
要点:
- 各项目之间使用逗号隔开,而输出时则以空白字符分隔;
- 输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后在输出;
- print命令后面的item可以省略,此时其功能相当于print $0,因此,如果想输出空白行,则需要使用print "";
例子:
#awk ‘BEGIN {print "line one\nline two\nline three"}‘
awk -F:‘{print $1,$3}‘ /etc/passwd
二、awk变量
- awk内置变量之记录变量:
FS:field,separator,读取文本时,所使用的字段分隔符;
RS:Record separator,输入文本信息所使用的换行符;
OFS:Output Filed Separator
ORS:Output Row Separator
- awk内置变量之数据变量:
NR:the number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数;
NF:Number of Field,当前记录的field个数;
FNR:与NR不同的是,FNR用于记录正在处理的行是当前这一文件中被总共处理的行数;
ARGV:数组,保存命令行本身这个字符串,如awk ‘{print $0}‘ a.txt b.txt 这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC:awk命令的参数的个数;
FILENAME:awk命令所处理的文件个数;
ENVIRON:当前shell环境变量及其值得关联数组;
如:awk ‘BEGIN{print ENviron["PATH"]}‘
- 用户自定义变量
gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。
1)在脚本中赋值变量
在gawk中给变量赋值使用赋值语句进行,例如:
awk ‘BEGIN {var="variable testing";print var}‘
2)在命令行中使用赋值变量
gwak命令也可以在“脚本”外为变量赋值,并在脚本中引用。例如,上述的例子还可以改写为:
awk -v var="variable testing" ‘BEGIN{print var}‘
三、printf
printf命令的使用格式:
printf format,item1,item2,...
要点:
- 其与print命令的最大不同是,printf需要指定format;
- format用于指定后面的每个item的输出格式;
- printf语句不会自动打印换行符;\n
format格式的指示符都以%开头,后跟一个字符;如下:
%c:显示字符的ASCII码;
%d,%i:十进制整数;
%e,%E:科学计数法显示数值;
%f:显示浮点数;
%g,%G:以科学计数法的格式或浮点数的格式显示数值;
%s:显示字符串;
%u:无符号整数;
%%:显示%自身;
修饰符:
N:显示宽度;
-:左对齐;
+:显示数值符号;
例子:
#awk -F :‘{printf "%-15s %i\n",$1$3}‘ /etc/passwd
四、输出重定向
print items > output-file
print items >> output-file
print items | command
特殊文件描述符:
/dev/stdin:标准输入
/dev/sdtout:标准输出
/dev/stderr:错误输出
/dev/fd/N:某特定文件描述符,/dev/stdin就相当于/dev/fd/0;
例子:
#awk -F : ‘{printf "%-15s %i\n",$1,$3 > "/dev/stderr"}‘ /etc/passwd
六、awk的操作符:
1. 算术操作符:
-x: 负值
+x: 转换为数值;
x^y:
x**y: 次方
x*y: 乘法
x/y:除法
x+y:
x-y:
x%y:
2. 字符串操作符:
只有一个,而且不用写出来,用于实现字符串连接;
3. 赋值操作符:
=
+=
-=
*=
/=
%=
^=
**=
++
--
需要注意的是,如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代;
4. 布尔值
awk中,任何非0值或非空字符串都为真,反之就为假;
5. 比较操作符:
x < y True if x is less than y.
x <= y True if x is less than or equal to y.
x > y True if x is greater than y.
x >= y True if x is greater than or equal to y.
x == y True if x is equal to y.
x != y True if x is not equal to y.
x ~ y True if the string x matches the regexp denoted by y.
x !~ y True if the string x does not match the regexp denoted by y.
subscript in array True if the array array has an element with the subscript subscript
7. 表达式间的逻辑关系符:
&&
||
8. 条件表达式:
selector?if-true-exp:if-false-exp
if selector; then
if-true-exp
else
if-false-exp
fi
a=3
b=4
a>b?a is max:b ia max
9. 函数调用:
function_name (para1,para2)
七、awk的模式:
awk ‘program‘ input-file1 input-file2 ...
其中的program为:
pattern {action}
pattern {action}
...
- 常见的模式类型:
1)Regexp:正则表达式,格式为/regular expression/
2)expression:表达式,其值非0或为非空字符时满足条件,如:$1~/foo/或$1 == "xxx",用运算符~(匹配)和!~(不匹配)。
3)Ranges:指定的匹配范围,格式为pat1,pat2
4)BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一行
5)Empty(空模式):匹配任意输入行;