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

相关推荐

  • Linux源码包安装详解

    安装源码包 安装一个源码包,是需要我们自己把源代码编译成二进制的可执行文件。如果你读得懂这些源代码,那么你就可以去修改这些源代码自定义功能,然后再去编译成你想要的。使用源码包的好处除了可以自定义修改源代码外还可以定制相关的功能,因为源码包在编译的时候是可以附加额外的选项的。 源码包的编译用到了linux系统里的编译器,常见的源码包一般都是用C语言开发的,这也…

    Linux干货 2016-09-06
  • 第二周作业

    1. Linux上文件管理类命令总结及示例 文件管理命令主要由查看类命令和管理类命令组成 查看类命令 cat:显示文本 cat [OPTION]… [FILE].. tac:倒序查看文件内容 tac [OPTION]… [FILE].. head:显示文件前几行内容 head [OPTION]… [FILE].. -n#:指定获取前#行,也可直接使用-# -…

    Linux干货 2016-12-10
  • MySQL基础入门详解

    MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 想要使用MySQL来存储并操作数…

    2017-09-16
  • 请罗列Linux发行版的基础目录名称命名法则及功用规定

    Linux文件系统 <逻辑视图>     根文件系统(rootfs):         root filesystem     LSB,FHS:(FileSystem Heirache Standard)         /bo…

    Linux干货 2016-10-30
  • 编辑器之神VS神之编辑器

      在linux下有两款非常棒的处理器,它们的功能异常的强大,在普通使用者手中,我们或许仅仅把它们当做文本处理器,但在官方文档中,它们不仅仅被定义为开发工具。正如在windows下,office在我们手中仅仅是文本,表格,PPT等文件的处理工具,而在大神手中,Excel是可以用来作画的!PowerPoint 还可以用来播放视频!  &nb…

    Linux干货 2017-08-05
  • 2016 10 19 第5天作业

    20161019第5天作业 软链接和硬链接的区别 硬链接 ①硬链接文件不能跨分区创建 ②一个硬链接文件的删除不影响其他链接的访问 ③链接文件指向的源文件被删除后,链接文件还能正常访问源文件的数据 ④硬链接的文件类型是 –  普通文件 ⑤硬链接和源文件的属性(大小,权限,时间戳,Inode号)相同 ⑥硬链接不能对目录创建 ⑦创建硬链接会增…

    Linux干货 2016-10-20