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

相关推荐

  • LVM管理

    一、简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。 LVM的工作原理是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对…

    Linux干货 2016-09-06
  • LNMP安装过程中出现的问题及解决方法

    一、背景介绍    操作系统版本:centos6.8    nginx版本:nginx-1.10.2            mysql版本:mysql5.7.16    php版本:php5.6.28   由于mysql和php的…

    Linux干货 2016-11-23
  • 第五周

      第五周 1 显示/boot/grub/grub.conf中以至少一个空白字符开头的行;      grep "^[[:space:]]\+" /boot/grub/grub.conf 2 显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至…

    Linux干货 2017-01-02
  • 简单路由实验

    今天学习了路由相关的基础知识,为了加深印象,做了如下的一个实验。根据下面的网络拓扑图分别配置两台PC和路由,以实现PC1和PC2能够互相ping通。实验环境为VM虚拟机 在实验开始前,我们需要在路由添加两块网卡,PC机添加一块网卡,此实验网卡的链接方式是桥接,一共需要4台虚拟机,两台做PC机,两台做路由器 1、R2路由器的配置 [root@linuxpao&…

    Linux干货 2016-09-05
  • 磁盘及文件系统管理

    磁盘管理     MBR:master boot record 主引导记录。位于磁盘的0磁道0扇区共512字节,独立于操作系统之外的。512字节的划分               …

    Linux干货 2016-08-25
  • vim编辑器

    vim编辑器三种模式转换 G跳到尾行 gg:跳到首行 H:跳到当前页的首行 L: 跳到当前页的尾行 M: 跳到当前而的中间行 dd: 删除光标所在的行 #dd:多行删除 yy:复制行 #yy: 复制多行  Y: 复制整行 cc:删除当前行并输入新内容 #cc:删除多行 C:删除当前光标到行尾,并切换成插入模式 修改配置文件 全局: /etc/vimrc 用…

    2017-08-05