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 09:04

相关推荐

  • 1021作业

    关于用户和组相关配置文件的总结 /etc/passwd:用户及相关属性信息 在Linux /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。这个文件对所有用户都是可读的。但是Linux /etc/passwd文件中都有些什么内容呢? #cat/etc/pass…

    Linux干货 2016-10-24
  • Linux运维实战之一:初识计算机组成及Linux系统

    本次博文是Linux运维实战的开山篇,主要内容如下: 计算机的组成及其功能; Linux的不同发行版之间的联系与区别; Linux的哲学思想; Linux系统上命令的适用格式及一些常用命令的使用; Linux系统上如何获得帮助信息; Linux发行版的基础目录名称命名法则及功用规定; 一、计算机的组成及其功能: 问题引入:互联网时代,计算机是我们每天都要使用…

    Linux干货 2016-10-31
  • 马哥教育网络班21期-第八周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:是将广播域划分为多个小的冲突域,但广播域没有变。工作在OSI模型的数据链路层,端口很少;基于软件;可以处理上层事务。集线器:对接收到的信号进行再生整形放大,扩大网络传输距离;属于纯硬件网络底层设备,工作在OSI模型的物理层,不具有交换机的”智能记忆”和”学习”的能力;也不具…

    Linux干货 2016-08-29
  • 使用NFS和Samba文件服务搭建博客站点

    使用NFS和Samba文件服务搭建博客站点 实验目的:分别使用NFS和Smaba文件服务实现wordpress 实验要求: (1) server导出/data/application/web,在目录中提供wordpress; (2) client挂载nfs server导出的文件系统至/var/www/html;(3) 客户端1(lamp),部署w…

    2017-04-30
  • Linux用户与用户组的详解

    添加用户   创建或添加新用户使用useradd命令来实现,其命令用法为:   useradd [option] username   该命令的option选项较多,常用的主要有:   -c 注释      用户设置对账户的注释说明文字  …

    Linux干货 2016-08-05
  • awk用法一

      gawk程序是Unix中的原始awk程序的GNU版本,它提供了一种编程语言而不只是编辑器命令。在CentOS中awk命令实际上是gawk程序的链接文件名。   基本语法:     awk [options] ‘program’ flie1 file2 ……

    Linux干货 2015-12-24