shell

shell.4.1 GNU/AWK(基本概念与基础应用理论)

 

导语:
===============

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如果是组合语句,需要用花括号;

 

Leave a Reply

Your email address will not be published. Required fields are marked *