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

相关推荐

  • 6.vim编辑器使用方法总结

    vi: visual interface,文本编辑器 vim: vi improved,vi的增强版 文本:ASCII,Unicode, 文本编辑器种类: 行编辑器:sed, 全屏编辑器:nano,vi vim:模式化的编辑器 基本模式: 编辑模式,也叫命令模式 输入模式 末行模式:内置的命令行接口 模式转换: 编辑模…

    Linux干货 2017-08-06
  • 三.Linux博客-2016年7月24日帮助、history、别名、tree

    格式说明: 操作 概念 命令 说明及举例 三-1.帮助、history、别名、tree touch /etc/nologin 使普通用户不能登录(创建了一个文件,删掉就可以登陆)   ll /etc/nologin 查看那个文件 -rm -f /etc/  删…

    Linux干货 2016-08-23
  • N28-第四周:正则表达式练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。
    2、编辑/etc/group文件,添加组hadoop。
    3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop。
    4、复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。
    5、修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。
    6、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
    7、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
    8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
    9、找出/etc/passwd文件中的一位数或两位数;
    10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
    11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
    12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
    13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

    2017-12-24
  • Linux中的man命令使用方法

      Linux中的man命令就是manual的缩写,此命令是用来查看系统中自带的各种参考手册,帮助用户更好的了解并使用命令。   man命令的使用格式为: man COMMAND,即man后面跟上需要查询的命令,进到手册后有如下快捷按钮帮助用户更好的操作手册。     1.按键-j &nb…

    Linux干货 2016-10-20
  • 软件管理

    rpm:操作复杂、编译时间长、极易出现问题、依赖关系复杂、管理方便、 保存依赖关系,需要手工解决。
    yum:自动解决依赖关系、可以对rpm进行分组,基于组进行安装操作、引入仓库概念,支持多个仓库、配置简单

    2018-03-21
  • 8.3号,第6天

    三种权限rwx对文件和目录的不同意义: 权限对于目录的意义: 1,r权限:拥有此权限表示可以读取目录结构列表,也就是说可以查看目录下的文件名和子目录名,注意:仅仅指的是名字。 2、w权限:拥有此权限表示具有更改该目录结构列表的权限,总之,目录的w权限与该目录下的文件名或子目录名的变动有关,注意:指的是名字。具体如下:      …

    Linux干货 2016-08-05