导语:
===============
awk:报告生成器,格式化文本输出;
awk作者:Aho, Weinberger, Kernighan;
[root@KOU tmp]# [root@KOU tmp]# which --skip-alias awk /usr/bin/awk [root@KOU tmp]# ll /usr/bin/awk lrwxrwxrwx. 1 root root 4 May 21 20:19 /usr/bin/awk -> gawk [root@KOU tmp]#
1、 gawk命令:
属于编程语言,有内置变量,有内建函数,支持条件判断、循环、数组、变量、字段处理、行处理等;
2、 gawk处理文本的机制:
1> 逐行读取一行文本内容;
2> 对读取到的一行内容进行预先处理:利用gawk内置的输入分隔符对此行文本内容进行若干切片(根据读取的文本行内容的原始分隔符为基准);
3> gawk内部会自动为每个切片赋予一个内置的位置变量:$1 , $2 , $3 , …; $0表示原始文本行的整行内容;
4> 可以对某个切片片段进行额外加工和处理;可以对行内的所有片段做循环操作;gawk的循环操作不是对行间的处理,而是在切片字段间进行遍历循环的;
5> 加工处理完后可以只显示指定的切片字段内容;
3、命令说明:pattern scanning and processing language;模式扫描及处理语言;
命令格式:
gawk [ POSIX or GNU style options ] -f program-file [ — ] file …
gawk [ POSIX or GNU style options ] [ — ] program-text file …
pgawk [ POSIX or GNU style options ] -f program-file [ — ] file …
pgawk [ POSIX or GNU style options ] [ — ] program-text file …
dgawk [ POSIX or GNU style options ] -f program-file [ — ] file …
*****************************************************
正文概述:
==============
gawk命令格式基本用法:
gawk [options] ‘program’ FILE …
常用OPTIONS:
-F : 指明输入数据时使用的字段分隔符;<见示例5>
-v var=value : 自定义变量;
program的组成部分:PATTERN{ACTION STATEMENTS};
由模式和动作状态组成,”ACTION STATEMENTS”可以有多个语句,语句之间用分号’;’隔开;
********************************************************
一、ACTION STATEMENTS:
——————-
1、 print命令:
命令格式: print item1, item2, …
1> 打印输出文本切片字段时,多个字段间用逗号做分隔符;
2> 输出的各个”item”,可以是字符串、数值、当前记录的字段($1,$2,…)、变量、变量值(把变量替换为变量值)、gawk自己的表达式;
注意:手动指定的字符串需要用双引号;片段的位置变量不能用双引号,如果使用双引号,则显示位置变量名称自身;<见示例2>
3> 如果省略”item”,则相当于print $0;<见示例3>
1.1 内建变量:
FS : input field seperator , 输入字段分隔符(源文本为基准);默认为空白字符;打印输出后也是以空白字符为分隔;<见示例5>
OFS : output field seperator , 输出字段分隔符(打印显示);可以指定打印输出的分隔符,默认是空白字符;<见示例6>
RS : input record seperator , 输入时的换行符;<见示例7>
ORS : output record seperator , 输出时的换行符;<见示例7>
NF : number of field , 每一行的字段数量;’NF’表示的每行有多少字段,是数字;<见示例8>
{print NF} : 打印显示每行的字段数量;
{print $NF} : 打印显示每行的最后一个字段的具体内容;
NR : number of record , 行数;打印显示文本行数,只显示数字,对文本内容进行行编号;如果后面接多个文件,则编号数字按序计数;<示例9>
FNR : field number of record , 行数;打印显示文本行数,只显示数字,对文本内容进行行编号;如果后面接多个文件,则对每个文件的行编号进行单独计数;<示例9>
{print NR}、{print FNR}
FILENAME : 显示当前文件的文件名;<示例10>
{print FILENAME}
ARGC : 命令行参数的个数;文件内容有多少行就显示多少行的命令行参数个数的数字,在'{ACTION STATEMENTS}’前面加上”BEGIN”,则只显示一行;<示例11>
ARGV : 是一个数组,保存的是命令行所给定的各参数;文件内容有多少行就显示多少行的命令行参数个数数字,在'{ACTION STATEMENTS}’前面加上”BEGIN”,则只显示一行;<示例11>
{print ARGC}、{print ARGV}
1.2 自定义变量:
变量名区分字母大小写;
在”PATTERN”中引用自定义变量,无需在变量名前加”$”符号;而在”ACTION”中引用自定义变量,需要在变量名前加”$”符;
1> 使用固定格式定义’-v var=value’;
2> 直接在”program”中定义变量;
2、 printf命令:格式化输出;
命令格式: printf FORMAT, item1, item2, …
~]# awk ‘{printf “FORMAT1, FORMAT2, …\n”, item1, item2, …}’ /PATH/FROM/FILENAME
1> FORMAT必须要给出;
2> 默认不会自动换行,需要显式给出换行符”\n”;换行符位于格式符后面;
3> FORMAT中需要分别为后面的每个item指定一个格式化符号(格式符);
4> FORMAT中的格式符需要用双引号,FORMAT与item之间用逗号隔开;
2.1 格式符:<示例13>
%c : 显示字符的ASCII码;
%d , %i : 显式十进制整数;
%e , %E : 科学计数法数值显式;
%f : 显示为浮点数;
%g , %G : 以科学计数法或浮点形式显示数值;
%s : 显示字符串;
%u : 无符号整数;
%% : 显示%自身;
2.2 格式符的修饰符:修饰符位于格式符之前;”%修饰符格式符”;
#[.#] ‘#’表示数字,第一个’#’控制显示字符占用的宽度;第二个’#’表示小数点后的精度;
– 表示左对齐;默认是右对齐;
+ 显示数值的符号,正整数的符号;打印显示看不出什么特别意义;
修饰符+格式符的书写格式:
%#格式符;
%-#格式符;
带修饰符、格式符的完整格式:<示例14>
~]# awk ‘{“%#格式符字母1, $#格式符字母2, …”, item1, item2,…}’ /PATH/FROM/FILENAME
~]# awk ‘{“%-#格式符字母1, $-#格式符字母2, …”, item1, item2,…}’ /PATH/FROM/FILENAME
备注:”修饰符+格式符” 与 下一个 “修饰符+格式符” 之间可以用各种分隔符,比如逗号,分号,空白字符,而且空白字符所占用的字符数空间会在打印时显示出效果;
2.3 操作符:
1> 算术运算操作符:
x+y, x-y, x*y, x/y, x^y, x%y (加、减、乘、除、次方、取模)
-x : 把正数转换为负数;
+x : 把字符串转换为数值;
2> 字符串操作符:默认只有一个,没有符号的操作符,表示字符串连接;
3> 赋值操作符:
=, +=, -=, *=, /=, ^=, %=;
++, –;
4> 比较操作符:
>, >=, <, <=, !=, ==;
5> 模式匹配符:
~ 左侧的字符串是否能被右侧的模式所匹配;
!~ 左侧的字符串是否不能被右侧的模式所匹配;
6> 逻辑操作符:
&& , || , ! ;
7> 函数调用:
function_name()
function_name(argu1,argu2, …)
8> 条件表达式:<示例15>
selector?if-true-expression:if-false-expression
判断条件表达式”selector”是否为真,为真则执行”if-true-expression”语句,否则,执行”if-false-expression”语句;
下面2条语句表达结果相同:
~]# gawk -F: ‘{$3>=1000?usertype=”common user.”:usertype=”sysadmin or sysuser”;printf “%-22s:%-8s:%-s\n”, $1,$3, usertype}’ /etc/passwd
~]# gawk -F: ‘$3>=1000?usertype=”common user.”:usertype=”sysadmin or sysuser” {printf “%-22s:%-8s:%-s\n”, $1,$3, usertype}’ /etc/passwd
二、PATTERN
1> empty : 空模式,不带任何”PATTER”模式,表示匹配文件的每一行;
2> /regular expression/ : 正则表达式,仅处理能够被此处的模式匹配到的行;<示例16>
!/regular expression/ : 表示取反;
举例:
~]# awk ‘/^UUID/ {print $1}’ /etc/fstab
~]# awk ‘!/^UUID/ {print $1}’ /etc/fstab
3> relational expression : 关系表达式;其结果有”真”有”假”,结果为”真”才会被处理;
此处”真”是指关系表达式的结果为非0值,或者非空字符串;
4> line ranges : 行范围;<示例17>
startline , endline ;不支持直接给出数字的格式;
具体格式举例如下:
(NR>=2&&NR<=10)
/PATTER1/,/PATTER2/
5> BEGIN/END模式: <示例18>
BEGIN{} : 仅在开始处理文件的文本之前执行一次;
END{} : 仅在文本处理完成后执行一次;
三、常用的ACTION
1> Expressions 表达式;
2> Control statements 控制语句,比如if , while等;
3> Compound statements 组合语句;
4> input statements
5> output statements
四、控制语句
if(condition) {statements}
if(condition) {statements} else {statements}
while(condition) {statements}
do{statements} while (condition) “do-while”循环:不管条件是真是假,先执行一次循环体;
for(控制变量初始化;条件判断表达式;控制变量的修正语句) {statements}
break
continue
delete array[index]
delete array
exit
备注:statements如果是组合语句,需要用花括号;