Linux三剑客命令—awk

技术Linux三剑客命令—awk Linux三剑客命令—awk一、概念说明
官方概念说明:gawk - pattern scanning and processing language
模式扫描和处理文

Linux三剑客命令——啊

一、概念说明

官方概念描述:

呆呆模式扫描和处理语言

模式扫描和处理文件语言

AWK是一种处理文本文件的语言,主要用于格式化文本,是一种强大的文本分析工具。

之所以叫AWK,是因为它采用了三位创始人——阿尔弗雷德艾侯、彼得温伯格和布莱恩克尼根的姓氏首字母。

二、awk功能应用说明

处理文件信息

文本文件信息

日志文件信息

档案信息

文件的处理

排除信息

查询信息

统计信息

替换信息

三、awk语法原理

3.1 命令语法格式

标准格式:

awk[选项]“模式{操作}”[文件信息]

awk[参数][处理规则][操作对象]

参数:

-F :指定文本分隔符(默认为空格作为分隔符)

适用于打印系统所有用户的解析器

awk-f :“{ print $ NF }”/etc/passwd

模式描述(匹配信息):

正常模式(定位)

正则表达式模式

Eg:从根开始打印行

[root @ localhost ~]# awk-f : '/^root/{print $ 0 } '/etc/passwd

比较表达式模式

相关符号:

=

=

~:常规匹配

!~:常规匹配(反转)

要求打印组标识大于所有者标识的行。

[root @ localhost ~]# awk-f : ' $ 4 $ 3 { print $ 0 } '/etc/passwd

结尾包含bash。

[root @ localhost ~]# awk-f : ' $ NF ~/bash/{ print $ 0 } '/etc/passwd

结尾不包含bash。

[root @ localhost ~]# awk-f : ' $ NF!~ /bash/{print $0}' /etc/passwd

逻辑表达模式

相关符号:

3360逻辑和

|||:逻辑或

!逻辑否定

属群所有者的ID大于2000,属群所有者的ID *大于2000。

[root @ localhost ~]# awk-f : ' $ 3 $ 4 2000 $ 3 * $ 4 2000 { print $ 0 } '/etc/passwd

属组所有者的标识需要大于2000或者属组所有者的标识*需要大于2000。

[root @ localhost ~]# awk-f : ' $ 3 $ 4 2000 | | $ 3 * $ 4 2000 { print $ 0 } '/etc/passwd

组所有者的标识不超过2000(小于或等于2000)。

[root@localhost ~]# awk -F: '!($3 $4 2000){print $0}' /etc/passwd

算术表达式模式

相关符号:

-

*

/

%

该组所有者的标识必须大于2000。

[root @ localhost ~]# awk-f : ' $ 3 $ 4 2000 { print $ 0 } '/etc/passwd

组*所有者的标识必须大于2000。

[root @ localhost ~]# awk-f : ' $ 3 * $ 4 2000 { print $ 0 } '/etc/passwd

要求打印偶数行。

[root @ localhost ~]# awk-f : ' NR % 2==0 { print $ 0 } '/etc/passwd

需要打印奇数行。

[root @ localhost ~]# awk-f : ' NR % 2==1 { print $ 0 } '/etc/passwd

条件表达式模式

相关符号:

==

=

=

第三行需要打印。

[root @ localhost ~]# awk-f : ' NR==3 { print $ 0 } '/etc/passwd

  • 范围表达式模式

    eg:打印以root开头到以ftp开头的行
    	[root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
    
  • 特殊模式

    • BEGIN{}

      概念说明:括号里面的内容会在awk读取文件之前执行

      awk 'BEGIN{print "oldboy"}{print $0}' reg.txt 
      

      作用说明:

      用于测试
      用于计算
      修改内置变量
      
    • END{}

      概念说明:括号里面的内容会在awk读取文件之后执行

      awk '{print $0}END{print "end of file"}' reg.txt  
      

      作用说明:

      显示计算最终结果
      用于计算
      
  • 内置变量

    $0	: 代表当前行
    	[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd
    	
    $n	:代表第n列
    	[root@localhost ~]# awk -F: '{print $1}' /etc/passwd	
    	
    NF  :记录当前行的字段数(表示每一行有多少列)
    	[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
    	[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd
    	
    NR	:用来表示行号信息
    	[root@localhost ~]# awk -F: '{print NR}' /etc/passwd
    	
    FS  :指定文本内容分隔符(默认是空格)
    	[root@localhost ~]# awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
    OFS :指定打印分隔符(默认空格)
    	[root@localhost ~]# awk -F: 'BEGIN{OFS="  "}{print $NF, $1}' /etc/passwd
    

    FS 的优先级要高于 -F:-F ":" ==BEGIN{FS=":"} == -vFS=":"

  • 3.2 命令执行过程

    grep、sed和awk都是读一行处理一行,直至处理完成。

    awk的生命周期如下:

    1. 接收一行作为输入;
    2. 把刚刚读入进来得到的文本进行分解;
    3. 使用处理规则处理文本;
    4. 输入一行,赋值给$0,直至处理完成;
    5. 把处理完成之后的所有的数据交给END{}来再次处理;

    四、awk实践操作

    4.1 实践环境创建

    cat ./reg.txtEOF
    Zhang Dandan 41117397 :250:100:175
    Zhang Xiaoyu 390320151 :155:90:201
    Meng Feixue 80042789 :250:60:50
    Wu Waiwai 70271111 :250:80:75
    Liu Bingbing 41117483 :250:100:175
    Wang Xiaoai 3515064655 :50:95:135
    Zi Gege 1986787350 :250:168:200
    Li Youjiu 918391635 :175:75:300
    Lao Nanhai 918391635 :250:100:175
    EOF
    

    4.2 命令操作实践

    • 查询实践

      查找实践参数:

      指定列的分隔符号(参数): -F ""
      显示指定行号信息(模式): NR==
      显示指定列的信息(动作): print 
      

      案例说明:

      按行查找文件数据信息:
      	awk 'NR==1' reg.txt
      	awk  '/250/' reg.txt
      	
      按行按列查找文件信息:
      	awk -F':' 'NR==1{print $1}' reg.txt
      	awk -F':' 'NR==1{print $1,$2}' reg.txt
      	awk -F':' '$3~/0+/' reg.txt
      

      ~ 在awk中表示匹配或者包含什么信息;

      !~ 在awk中表示不匹配或者不包含什么信息;

    • 查询测验(显示指定行的指定列的信息)

      1. 显示xiaoyu的姓氏和ID号码

        条件是什么: 找出第二列包含xiaoyu的信息
        动作是什么: 显示xiaoyu这行指定列信息
        实践操作: 
        	awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
        
      2. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字

        条件是什么: 找出第一列包含zhang的信息
        动作是什么: 显示zhang这行指定列信息
        实践操作: 
        	awk -F '[ :]+' '$1~/Zhang/{print $1 $2,$5}' reg.txt
        	awk -F '[ :]+' '$1~/Zhang/{print $1 $2,$(NF-1)}' reg.txt 
        
      3. 显示所有以41开头的ID号码的人的全名和ID号码

        条件是什么: 显示以41开头的ID号
        动作是什么: 显示41开头号码,人的全名的对应列
        实践操作: 
        	awk '$3~/^41/{print $1 $2,$3}' reg.txt
        
      4. 显示所有ID号码最后一位数字是1或5的人的全名

        条件是什么: 以1或5结尾的ID号码
        动作是什么: 显示人的全名对应列
        实践操作: 
        	awk '$3~/[15]$/{print $1 $2}' reg.txt 
        	awk '$3~/(1|5)$/{print $1 $2}' reg.txt 
        	awk '$3~/1$|5$/{print $1 $2}' reg.txt 
        
      5. 显示Xiaoyu的捐款信息,并以$开头, 如:$110$220$330

        条件是什么: 找出xiaoyu的信息
        动作是什么: 显示捐款信息,在数值前赋予$
        实践操作: 
        	awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $0}' reg.txt
        

        gsub 是一个函数。

    • 特殊模式应用案例

      1. 统计/etc/services文件中空行数量

        grep应用:
        	grep '^$' /etc/services|wc -l
        	grep -c '^$' /etc/services
        	
        awk应用:
        	awk '/^$/{i++}END{print i}' /etc/services  (表示前面先计算,最后通过END将结果进行显示)
        
      2. 统计/etc/passwd文件中有多少个虚拟用户

        awk '/nologin$/{i++}END{print i}' /etc/passwd
        
      3. 统计文件中的数值的和

        seq 10|awk '{sum=sum+$0}END{print sum}'
        

    五、awk相关扩展

    4.1 awk中的函数

    print	: 打印
    printf	:格式化打印
    	%s	: 字符串
    	%d	:数字
    	-   :左对齐
    	+   :右对齐
    	15(任意数字)  : 至少占用15字符
    	
    eg:	
    	[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%-15s|%-15s|\n", $NF,$1}' /etc/passwd
    

    4.2 awk中的流程控制(只存在循环之中)

    if: 
    	if(){}
    	if(){}else{}
    	if(){}else if(){}else{}	
    		
    eg:
    	[root@localhost ~]# awk -F: '{if($3$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
    			
    			
    for: 
    	for(i="初始值";条件判断;游标){}	
     	
     eg:
     	[root@localhost ~]# awk -F: '{for(i=10;i0;i--){print $0}}' /etc/passwd
    		
    		
    while: 
    	while(条件判断){}
    eg:
    	[root@localhost ~]# awk -F: '{i=1; while(i10){print $0, i++}}' /etc/passwd
    	
    

    4.3 awk数组详述

    • 数组知识学习准备

      统计计算方法说明:

      i=i+1 :
      先计算右边,将右边数值给左边变量
      i=0 i=0+1 i=1+1    (统计次数)
      eg:
      	awk '/^$/{i=i+1;print i}' /etc/services
      	awk '/^$/{i++;print i}' /etc/services
      	
      	
      i=i+$0 : 表示对每行的数字进行累加求和运算
      i=0 i=0+$0 i=$0(上一行)+$0(当前行)  (求和运算)
      eg:
      	seq 10|awk '{sum=sum+$n;print $n,sum}'  
      
    • 数组概念知识说明

      数组形式说明:

      hotel[110]="张三" :
      hotel		数组名称
      [110]		数组元素
      "张三"     元素内容
      

      数组实际应用:

      awk 'BEGIN{h[110]="UFO";h[114]="XO";print h[110],h[114]}'
      ...
      

    内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155870.html

    (0)

    相关推荐

    • 垂耳兔为什么不吉利,养垂耳兔要注意什么问题

      技术垂耳兔为什么不吉利,养垂耳兔要注意什么问题我养的就是垂耳兔,说要注意什么的,我其实还真没特别注意,我养了两年,到现在一点儿病没有生过,平时都吃兔粮,但是兔粮营养成分不太跟的上,建议不要单一的吃兔粮,所以我后面加了各种

      生活 2021年10月22日
    • iOS如何实现横竖屏幕设定

      技术iOS如何实现横竖屏幕设定小编给大家分享一下iOS如何实现横竖屏幕设定 ,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!iOS 6以下横竖屏

      攻略 2021年10月21日
    • Jscript中有哪些内部对象

      技术Jscript中有哪些内部对象小编给大家分享一下Jscript中有哪些内部对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内部对象  M

      攻略 2021年11月30日
    • Python代码格式化工具pycodestyle怎么使用

      技术Python代码格式化工具pycodestyle怎么使用本篇内容介绍了“Python代码格式化工具pycodestyle怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学

      攻略 2021年11月29日
    • 清朝统治多少年,明朝和清朝各存在了多少年

      技术清朝统治多少年,明朝和清朝各存在了多少年明朝(1368年―1644年)是中国历史上最后一个由汉族建立的大一统王朝清朝统治多少年,共传十六帝,享国二百七十六年。一、太祖元璋,洪武,在位3l年。二、惠帝允炆,建文,在位

      生活 2021年10月28日
    • 将JavaDoc注释生成API文档的操作是怎样的

      技术将JavaDoc注释生成API文档的操作是怎样的本篇文章为大家展示了将JavaDoc注释生成API文档的操作是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。将JavaD

      攻略 2021年11月24日