gawk基础

 一、gawk 是什么

在了解gawk之前,先了解一下文本三工具

    

文本过滤工具:grep|egrep|fgrep   其中fgrep不支持正则表达式

1.行编辑器:sed      sed 有两种空间   模式空间    保持空间

2. 文本报告工具:awk|gawk    格式化文本输出;他在处理文本文件时,对文档中的数据有条件的输出

3. gawk – pattern scanning and processing languageawk         本质上一个编程语言。   想要了解更详细就 Google

现在先看看awk在系统上是?

图片1.png

原来awk是gawk,从上面看就知道/bin/awk是gawk的软连接

二、awk的工作方式

1.awk 一次读取一行文本   用输入分隔符(默认为空格)进行切片。

awk使用一行作为输入(通过文件或者管道),并将这一行赋给内部变量$0,默认时每一行也可以称为一个记录,      以换行符结束\n

  $0

2.然后,行被空格分解成字段(单词),每一个字段存储在已经编号的变量中,$1开始。

$1

$2

$3

$4

………………

图片2.png

图片3.png



  以上实例就可以说明awk 的工作方式,awk默认是空格作为分隔符的。在awk中无论多少空格都会当一个空格。

 cat是无法理解多个空格的,准确的说是以固定的格式来识别的。 print后面会有说明。

三、awk的使用

1. 基本用法:gawk  [options] 'program'  FILE …..         

  program: PATTERN{ACTION STATEMENTS}    

  'program':   gawk自己的编程语言

  PATTERN:  模式

  ACTION STATEMENTS:动作语句:语句有多个可以用分号(;)分隔

  option:基础常用的选项

  -F:指明输入时用到的字段分隔符;

-v var=value: 自定义变量;

 输出命令:在awk中总要输出结果的。既然要输出那就先了解一下简单的输出命令prin

2. print:

 print item1, item2, …

图片4.png

从上述结果就可以看出print是逗号分隔。逗号是告诉print是多个字段的。

要点:

(1) 逗号分隔符;

(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;

 例:

                                            

图片5.png

   其中的hello就是字符串,6就是数值,

(3) 如省略item,相当于print $0; 

图片6.png

 

  awk本质上是编程语言,那就他肯定也会有变量的。

 3. 变量:每一个-v选项定义一个变量;变量分内建变量和自定义变量

 常用的内建变量:  

FS:input field seperator,默认为空白字符;输入字段分隔符

OFS:output field seperator,默认为空白字符;输出字段分隔符

  例:

图片7.png

图片8.png

从上述例子可以看出,每一个-v定义一个变量,FS是输入分隔符 ,OFS是输出分隔符,

上述例子可以看出输入的分隔符是:   输出分隔符是—

RS:input record seperator,输入时的换行符;行分隔符

ORS:output record seperator,输出时的换行符;

 对于awk命令而言,处理字段分隔符,还有行分隔符。行分隔符可以自己定义

例:

 

   图片9.png

图片10.png

从上述例子就可以看出:就可以我把(:)定义为行分隔符了,输入的是空格

 NF:number of field,字段数量   

  例:

图片11.png

图片12.png

这个就不说了 :就是一一对应的看就行了

{print NF}, {print $NF}   awk 中不需加$

如果加上$,就会引用最后段

NR:number of record, 行数;  显示行数  对行统一技术

 FNR:各文件分别计数;行数;

 

例:

图片13.png

从上述例子可以看出,NR是统计行数的,当多个文件时,他会统一的显示所有的文件行数。

 FILENAME:当前正在处理的文件名;

图片14.png

  ARGC:命令行给定的参数的个数;

 图片15.png

 ARGV:数组,保存的是命令行所给定的各参数;awk也当做一个参数

 图片16.png                

       自定义变量: 

        (1) -v var=value      var是变量名  value:值

 对于awk变量名也区分字 符大小写;

图片17.png

 

      (2) 在program中直接定义

图片18.png

格式化输出命令printf

                格式化输出:printf FORMAT, item1, item2, …

                要点:

(1) FORMAT必须给出; 

(2) 不会自动换行,需要显式给出换行控制符,\n  

(3) FORMAT中需要分别为后面的每个item指定一个格式化符号;

 

格式符:

%c: 显示字符的ASCII码;

%d, %i: 显示十进制整数;

%e, %E: 科学计数法数值显示;

%f:显示为浮点数;

%g, %G:以科学计数法或浮点形式显示数值;

%s:显示字符串;

%u:无符号整数;

%%: 显示%自身;

     例:

  图片19.png

\n换行符,  

  图片20.png

这个其实就是$1输出的格式符就是%s,$2就是%i的修饰符。

                       格式符中还有修饰符:

#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;

%3.1f

-: 左对齐

+:显示数值的符号       

例:

图片21.png

这个可以直接看上面。

4、awk中的操作符

(1)算术操作符:

x+y, x-y, x*y, x/y x^y, x%y  +:加  -:减:*乘:/除:^乘方:%:取余

-x:负数 

+x: 转换为数值;

 

(2)字符串操作符:没有符号的操作符,字符串连接

  赋值操作符:

  =

  +=

 -=

  *=

  /=

  %=

   ^=

  ++:自加

   –:自减

                          

(3)比较操作符:>, >=, <, <=, !=,  ==

 

(4)模式匹配符:

 ~:是否匹配

!~:是否不匹配

 

(5)逻辑操作符:

&& 与

|| 或

!  非

(6)函数调用:

function_name(argu1, argu2, …)

              

(7)简单条件表达式:

selector?if-true-expression:if-false-expression

                         selector 条件表达时

图片22.png

  awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

对  $3>=1000 判断是否系统用户还是普通用户。 usertype="Common User":usertype="Sysadmin or SysUser"    定义类型  

printf "%15s:%-s\n",$1,usertype  输出:如果大于1000输出第一个也就是Common User,反之就第二个

5、PATTERN:模式

 

(1) empty:空模式,匹配文本的每一行;

                              之前用到的都是empty

(2) /regular expression/:仅处理能够被此处的模式匹配到的行;

                              显示./etc/fstab中的uuid的行

         awk  '/^UUID/{print $1}'  /etc/fstab      

                                   取反

                                 awk  '!/^UUID/{print $1}'  /etc/fstab

                        (3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;

真:结果为非0值,非空字符串;

                                判断是系统用户还普通用户

                               awk ‘$3>=1000{print $1,$3},/etc/passwd

                               判断shell是/bin/bash的用户。

                               awk -F: '$NF=="/bin/bash"'{print $1,$NF}' /etc/passwd

                        (4) line ranges:行范围,地址定界

startline,endline:/pat1/,/pat2/

                                  注意: 不支持直接给出数字的格式

                                        基于条件判断的     

~]# awk -F: '(NR>=2&&NR<=10){print $1}'  /etc/passwd

(5) BEGIN/END模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次;

END{}:仅在文本处理完成之后执行一次;

   图片23.png

图片24.png

BEGIN{}只有执行一次的 END{}在结束时执行次

6、常用的action

 

(1) Expressions   :  表达式

(2) Control statements:if, while等; 控制语句

(3) Compound statements:组合语句;

(4) input statements输入语句    

(5) output statements 输出语句

      好了这就是基础了 ,方正就是多练就行了  ,可以man  gawk 

 

原创文章,作者:N19_king,如若转载,请注明出处:http://www.178linux.com/20020

(2)
N19_kingN19_king
上一篇 2016-06-24 12:48
下一篇 2016-06-26

相关推荐

  • 访问控制列表ACL

     ACL是Access Control List的缩写,主要的目的是提供传统的owner、group、others的read、write、execute权限之外的具体权限设置。ACL可以针对单一用户、单一文件、单一目录来进行r、w、x的权限设置,对于需要特殊权限的使用状况非常有帮助。使用getfacl和setfacl来设置查看acl的权限。ACL权…

    Linux干货 2016-08-07
  • 马哥教育网络班21期+第1周课程练习

    一、计算机原理及组成部分 数学家冯·诺依曼,按不同功能把计算机分成了五大组成部分:运算器、控制器、存储器、输入设备、输入出设备。 现代计算机把运算器和控制器集成在一起,称为CPU,主要进行各种数据运算和对各种命令进行解释;存储器被分为两类,一类以内存为代表的随机存储设备,主要特点是速度快,容量有限,断电后信息就消失,另一类是硬盘为代表的外部存储设备,容量大,…

    Linux干货 2016-06-26
  • linux入门

    基本知识和操作用法。

    Linux干货 2017-11-30
  • 如何在Java中避免equals方法的隐藏陷阱

    译者注 :你可能会觉得Java很简单,Object的equals实现也会非常简单,但是事实并不是你想象的这样,耐心的读完本文,你会发现你对Java了解的是如此的少。如果这篇文章是一份Java程序员的入职笔试,那么不知道有多少人会掉落到这样的陷阱中。原文转自http://www.artima.com/lejava/articles/equality.…

    开发运维 2015-04-03
  • 第十四周作业

    系统的INPUT和OUTPUT默认策略为DROP; 1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机; ]# iptables -P INPUT DROP #INPUT默认策略为DROP ]# iptables -P OUTPUT DROP…

    Linux干货 2017-04-12