2019-12-20

需要巧记,很多格式,学习难度:grep、sed、awk


awk知识概述

1三剑客awk命令介绍
2三剑客awk命令执行原理语法结构
3三剑客awk命令实操练习
查询替换信息排除(取反)
4三剑客awk命令高级功能

一awk命令概述

awk     -pattern scanning and processing language

模式扫描(处理文件每一行信息)

过程语言(一门脚本语言、逻辑语句(循环/判断))

读取内容放到内存里面,而不是模式空间。模式就相当于sed的条件

命令语法结构:awk  [参数]   ‘模式{动作信息}’    文件信息

作用说明:
1)擅长对文件列进行操作

2)擅长统计分析数据信息

  1. [root@centos71 test]# cat awk.txt
  2. #!/bin/awk
  3. [root@centos71 test]# file awk.txt
  4. awk.txt: awk script, ASCII text executable
  5. [root@centos71 test]# cat python
  6. #!/bin/python
  7. [root@centos71 test]# file python
  8. python: a /bin/python script, ASCII text executable

二awk命令操作

空格和制表符是有区别的

匹配空格时无法匹配制表符

对文件对齐

  1. [root@centos71 test]# df
  2. Filesystem 1K-blocks Used Available Use% Mounted on
  3. /dev/sda3 41922560 3010792 38911768 8% /
  4. devtmpfs 487064 0 487064 0% /dev
  5. tmpfs 497960 0 497960 0% /dev/shm
  6. tmpfs 497960 7924 490036 2% /run
  7. tmpfs 497960 0 497960 0% /sys/fs/cgroup
  8. /dev/sda1 201380 107080 94300 54% /boot
  9. tmpfs 99596 0 99596 0% /run/user/0
  10. [root@centos71 test]# df | column -t
  11. Filesystem 1K-blocks Used Available Use% Mounted on
  12. /dev/sda3 41922560 3010792 38911768 8% /
  13. devtmpfs 487064 0 487064 0% /dev
  14. tmpfs 497960 0 497960 0% /dev/shm
  15. tmpfs 497960 7924 490036 2% /run
  16. tmpfs 497960 0 497960 0% /sys/fs/cgroup
  17. /dev/sda1 201380 107080 94300 54% /boot
  18. tmpfs 99596 0 99596 0% /run/user/

(一)显示xiaoyu的姓氏和ID号码

根据条件找出相应行

  1. [root@centos71 test]# cat awk.txt
  2. Zhang Dandan 41117397 :250:100:175
  3. Zhang Xiaoyu 390320151 :155:90:201
  4. Meng Feixue 80042789 :250:60:50
  5. Wu Waiwai 70271111 :250:80:75
  6. Liu Bingbing 41117483 :250:100:175
  7. Wang Xiaoai 3515064655 :50:95:135
  8. Zi Gege 1986787350 :250:168:200
  9. Li Youjiu 918391635 :175:75:300
  10. Lao Nanhai 918391635 :250:100:175
  11.  
  12. [root@centos71 test]# awk '/Xiaoyu/{print $0}' awk.txt
  13. Zhang Xiaoyu 390320151 :155:90:201
  14. [root@centos71 test]# awk '/Xiaoyu/' awk.txt
  15. Zhang Xiaoyu 390320151 :155:90:

awk取出多列信息可以使用 , 或者 " " 进行分隔

注意只能使用双引号

  1. [root@centos71 test]# awk '/Xiaoyu/{print $1" "$3}' awk.txt
  2. Zhang
  1. [root@centos71 test]# awk '/Xiaoyu/{print $1,$3}' awk.txt
  2. Zhang

在系统中有时引号需要嵌入式使用时,不能使用相同:

  1. [root@centos71 test]# awk '/Xiaoyu/{print $1' '$3}' awk.txt
  2. awk: cmd. line:1: /Xiaoyu/{print $1
  3. awk: cmd. line:1: ^ unexpected newline or end of string

$n~/xxx/取出第n列里面有xxx信息

~表示匹配,出现在awk或者搭建网站的配置文件里面

  1. [root@centos71 test]# awk '$2~/Xiaoai/{print $1,$4}' awk.txt
  2. Wang :50:95:

(二)姓氏是zhang的人,显示他的第二次捐款金额及他的名字

根据条件找出相应行

  1. [root@centos71 test]# awk '$1~/Zhang/' awk.txt
  2. Zhang Dandan 41117397 :250:100:175
  3. Zhang Xiaoyu 390320151 :155:90:201
  4. [root@centos71 test]#

[ :]+表示以空格或者冒号作为分隔符,一次或者多次

  1. [root@centos71 test]# cat awk.txt
  2. Zhang Dandan 41117397 :250:100:175
  3. Zhang Xiaoyu 390320151 :155:90:201
  4. Meng Feixue 80042789 :250:60:50
  5. Wu Waiwai 70271111 :250:80:75 Xiaoai
  6. Liu Bingbing 41117483 :250:100:175
  7. Wang Xiaoai 3515064655 :50:95:135
  8. Zi Gege 1986787350 :250:168:200
  9. Li Youjiu 918391635 :175:75:300
  10. Lao Nanhai 918391635 :250:100:175
  11.  
  12. [root@centos71 test]# awk -F "[ :]+" '$1~/Zhang/{print $1,$2,$5}' awk.txt
  13. Zhang Dandan 100
  14. Zhang Xiaoyu

#|  "表示#和空格是一个字符串了,整体识别

利用-F指定列分隔符,结合正则可以识别多个分隔符号

  1. [root@centos61 ~]# awk -F "#| " '{print $1,$3}' /etc/selinux/config
  2.  
  3. This
  4. SELINUX=
  5.  
  6. SELINUX=enforcing
  7. SELINUXTYPE=
  8.  
  9. SELINUXTYPE=targeted
  10.  
  11. [root@centos61 ~]# cat /etc/selinux/config
  12.  
  13. # This file controls the state of SELinux on the system.
  14. # SELINUX= can take one of these three values:
  15. # enforcing - SELinux security policy is enforced.
  16. # permissive - SELinux prints warnings instead of enforcing.
  17. # disabled - No SELinux policy is loaded.
  18. SELINUX=enforcing
  19. # SELINUXTYPE= can take one of these two values:
  20. # targeted - Targeted processes are protected,
  21. # mls - Multi Level Security protection.
  22. SELINUXTYPE=targeted
  1. [root@centos61 ~]# lsblk
  2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  3. sr0 11:0 1 3.7G 0 rom
  4. sda 8:0 0 200G 0 disk
  5. ├─sda1 8:1 0 1G 0 part /boot
  6. ├─sda2 8:2 0 48.8G 0 part /
  7. ├─sda3 8:3 0 19.5G 0 part /app
  8. ├─sda4 8:4 0 1K 0 part
  9. └─sda5 8:5 0 2G 0 part [SWAP]
  1. [root@centos61 ~]# lsblk | awk -F "[: ]+" '{print $1,$3}' | column -t
  2. NAME MIN
  3. sr0 0
  4. sda 0
  5. ├─sda1 1
  6. ├─sda2 2
  7. ├─sda3 3
  8. ├─sda4 4
  9. └─sda5

(三)显示所有以41开头的ID号码的人的全名和ID号码

简单,注意正则被三剑客所使用

  1. [root@centos71 test]# awk '$3~/^41/' awk.txt
  2. Zhang Dandan 41117397 :250:100:175
  3. Liu Bingbing 41117483 :250:100:
  1. [root@centos71 test]# awk '$3~/^41/{print $1,$2,$3}' awk.txt
  2. Zhang Dandan 41117397
  3. Liu Bingbing

连续出现的字段可以使用高级方法

  1. [root@centos71 test]# awk '{for(i=1;i<=3;i++) printf $i""FS;print ""}' awk.txt
  2. Zhang Dandan 41117397
  3. Zhang Xiaoyu 390320151
  4. Meng Feixue 80042789
  5. Wu Waiwai 70271111
  6. Liu Bingbing 41117483
  7. Wang Xiaoai 3515064655
  8. Zi Gege 1986787350
  9. Li Youjiu 918391635
  10. Lao Nanhai 918391635

利用awk命令连续显示多列信息

  1. [root@centos71 test]# awk '{for(i=1;i<=3;i++){print $i}}' num.txt
  2. 01
  3. 02
  4. 03
  5. 01
  6. 02
  7. 03
  8. [root@centos71 test]# awk '{for(i=1;i<=3;i++){printf $i}}' num.txt
  9. 010203010203[root@centos71 test]#

换行显示

  1. [root@centos71 test]# awk '{for(i=1;i<=3;i++){printf $i" "};printf "\n"}' num.txt
  2. 01 02 03
  3. 01 02 03

(五)显示所有以5或者0结尾id显示出来,并显示人的名字和ID号码

  1. awk '$3~/[05]$/{print $1,$2,$3}' awk.txt
  2. Wang Xiaoai 3515064655
  3. Zi Gege 1986787350
  4. Li Youjiu 918391635
  5. Lao Nanhai
  1. [root@centos71 test]# awk '$3!~/[05]$/{print $1,$2,$3}' awk.txt
  2. Zhang Dandan 41117397
  3. Zhang Xiaoyu 390320151
  4. Meng Feixue 80042789
  5. Wu Waiwai 70271111
  6. Liu Bingbing 41117483
  1. [root@centos71 test]# which awk
  2. /usr/bin/awk
  3. [root@centos71 test]# ll /usr/bin/awk
  4. lrwxrwxrwx. 1 root root 4 Nov 26 17:32 /usr/bin/awk -> gawk

(六)显示Xiaoyu的捐款,每个都以$开头

 
  1. [root@centos71 test]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' awk.txt
  2. $155$90$
 
 
 

awk替换信息方法

gsub(/替换的信息/,"要替换成什么",$n替换的第几列信息)
  
 

二awk命令高级用法

awk模式概念:
普通模式:  利用正则进行匹配/利用行号进行匹配/利用字符进行匹配
特殊模式:  
BEGIN:  在处理文件之前先做的事情  (准备工作)

END:  在处理文件之后要做的事情  (后续工作)

(一)在处理文件之前加表头

  1. [root@centos71 test]# awk 'BEGIN{print"姓","名","id","金额"}{print $0}' awk.txt
  2. id 金额
  3. Zhang Dandan 41117397 :250:100:175
  4. Zhang Xiaoyu 390320151 :155:90:201
  5. Meng Feixue 80042789 :250:60:50
  6. Wu Waiwai 70271111 :250:80:75 Xiaoai
  7. Liu Bingbing 41117483 :250:100:175
  8. Wang Xiaoai 3515064655 :50:95:135
  9. Zi Gege 1986787350 :250:168:200
  10. Li Youjiu 918391635 :175:75:300
  11. Lao Nanhai 918391635 :250:100:
  1. [root@centos71 test]# awk 'BEGIN{print"姓","名","id","金额"}{print $0}' awk.txt | column -t
  2. id 金额
  3. Zhang Dandan 41117397 :250:100:175
  4. Zhang Xiaoyu 390320151 :155:90:201
  5. Meng Feixue 80042789 :250:60:50
  6. Wu Waiwai 70271111 :250:80:75 Xiaoai
  7. Liu Bingbing 41117483 :250:100:175
  8. Wang Xiaoai 3515064655 :50:95:135
  9. Zi Gege 1986787350 :250:168:200
  10. Li Youjiu 918391635 :175:75:300
  11. Lao Nanhai 918391635 :250:100:175

(二)进行四则运算

  1. [root@centos71 ~]# awk 'BEGIN{print 2+2}'
  2. 4
  3. [root@centos71 ~]# awk 'BEGIN{print 2-2}'
  4. 0
  5. [root@centos71 ~]# awk 'BEGIN{print 2*2}'
  6. 4
  7. [root@centos71 ~]# awk 'BEGIN{print 2/2}'

(三)进行变量设定

注意要加双引号,打印时不需要加$

  1. [root@centos71 ~]# awk 'BEGIN{name=wang;print name}'
  2.  
  3. [root@centos71 ~]# awk 'BEGIN{name="wang";print name}'
  4. wang

内置变量NR表示行号信息

  1. [root@centos71 ~]# cat -n /etc/issue
  2. 1 \S
  3. 2 Kernel \r on an \m
  4. 3
  5. [root@centos71 ~]# awk '{print NR}' /etc/issue
  6. 1
  7. 2

NF:显示一行里面的字段数量

  1. [root@centos61 ~]# cat /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. sync:x:5:0:sync:/sbin:/bin/sync
  8. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  9. halt:x:7:0:halt:/sbin:/sbin/halt
  10. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  11. uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
  12. operator:x:11:0:operator:/root:/sbin/nologin
  13. games:x:12:100:games:/usr/games:/sbin/nologin
  14. gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
  15. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  16. nobody:x:99:99:Nobody:/:/sbin/nologin
  17. vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
  18. saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
  19. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  20. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  21. apache:x:48:48:Apache:/var/www:/sbin/nologin
  22. chrony:x:498:499::/var/lib/chrony:/sbin/nologin
  23. ntp:x:38:38::/etc/ntp:/sbin/nologin
  24. [root@centos61 ~]# cat /etc/passwd | wc
  25. 22 28 983
  26. [root@centos61 ~]# awk -F '{print NF}' /etc/passwd | wc
  27. 22 22

FS : 表示分隔符字段信息

  1. [root@centos61 ~]# df
  2. Filesystem 1K-blocks Used Available Use% Mounted on
  3. /dev/sda2 50264772 910576 46794196 2% /
  4. tmpfs 502068 0 502068 0% /dev/shm
  5. /dev/sda3 20027260 44992 18958268 1% /app
  6. /dev/sda1 999320 30508 916384 4% /boot
  7. [root@centos61 ~]# df | awk -v FS=" " '{print $1,$5}'
  8. Filesystem Use%
  9. /dev/sda2 2%
  10. tmpfs 0%
  11. /dev/sda3 1%
  12. /dev/sda1 4%
  13. [root@centos61 ~]# df | awk -v FS=" " '{print $1,$5}' | column -t
  14. Filesystem Use%
  15. /dev/sda2 2%
  16. tmpfs 0%
  17. /dev/sda3 1%
  18. /dev/sda1 4%

(四)END统计分析日志公式信息

  1. [root@centos61 ~]# awk '/sbin/{i=i+1}END{print i}' /etc/passwd
  2. 21
  3. [root@centos61 ~]# grep sbin /etc/passwd | wc
  4. 21 27
  1. [root@centos71 ~]# grep "sbin" /etc/passwd -o
  2. sbin
  3. sbin
  4. sbin
  5. sbin
  6. sbin
  7. sbin
  8. sbin
  9. sbin
  10. sbin
  11. sbin
  12. sbin
  13. sbin
  14. sbin
  15. sbin
  16. sbin
  17. sbin
  18. sbin
  19. sbin
  20. sbin
  21. sbin
  22. sbin
  23. sbin
  24. sbin
  25. sbin
  26. sbin

(五)END求和运算

求和公式: i=i+$n   $

n 需要将第几列做求和运算

i=i+$1    i=0    i=0+1    print i--->1
i=i+$1    i=1      i=1+1    print i--->2

初始值为0

  1. [root@centos61 ~]# seq 10 > seq.txt
  2. [root@centos61 ~]# cat seq.txt
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. [root@centos61 ~]# awk '{i=i+$1; print i}' seq.txt
  14. 1
  15. 3
  16. 6
  17. 10
  18. 15
  19. 21
  20. 28
  21. 36
  22. 45
  23. 55
  24. [root@centos61 ~]# awk '{i=i+$1}END{ print i}' seq.txt

awk基础学习的更多相关文章

  1. 鸟哥Linux私房菜基础学习篇学习笔记3

    鸟哥Linux私房菜基础学习篇学习笔记3 第十二章 正则表达式与文件格式化处理: 正则表达式(Regular Expression) 是通过一些特殊字符的排列,用以查找.删除.替换一行或多行文字字符: ...

  2. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  3. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  4. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  5. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  6. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

  7. python入门到精通[三]:基础学习(2)

    摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...

  8. python入门到精通[二]:基础学习(1)

    摘要:Python基础学习: 注释.字符串操作.用户交互.流程控制.导入模块.文件操作.目录操作. 上一节讲了分别在windows下和linux下的环境配置,这节以linux为例学习基本语法.代码部分 ...

  9. CSS零基础学习笔记.

    酸菜记 之 CSS的零基础. 这篇是我自己从零基础学习CSS的笔记加理解总结归纳的,如有不对的地方,请留言指教, 学前了解: CSS中字母是不分大小写的; CSS文件可以使用在各种程序文件中(如:PH ...

随机推荐

  1. AutoML文献阅读

    逐步会更新阅读过的AutoML文献(其实是NAS),以及自己的一些思考 Progressive Neural Architecture Search,2018ECCV的文章: 目的是:Speed up ...

  2. 前端 CSS的选择器

    什么是选择器.在一个HTML页面中会有很多很多的元素,不同的元素可能会有不同的样式,某些元素又需要设置相同的样式,选择器就是用来从HTML页面中查找特定元素的,找到元素之后就可以为它们设置样式了. 选 ...

  3. nrm安装与配置

    nrm安装与配置:https://blog.csdn.net/anway12138/article/details/79455224

  4. nginx启动报错

    nginx启动的时候报错 nginx: [emerg] invalid number of arguments in "root" directive in /etc/nginx/ ...

  5. 在django中使用循环与条件语言

    {% if not Article_type_id %} <li class="active"><a href="/">全部</a ...

  6. java中访问修饰符public,private,protected,friendly的作用域

    在修饰的元素上没有写任何的访问修饰符,则表示friendly. 作用域 当前类 同一包中 子孙类 其他包中 public √ √ √ √ protected √ √ √ × private √ x x ...

  7. k3 cloud中如何把一个账套中的单据部署到另一个账套中

    打开bos,依次点击->解决方案->部署包管理 填写部署包名称并点击下一步 选择需要部署的单据并点击下一步 确定后点击下一步: 点击完成 找到部署路径会成一个部署包: 部署:打开部署包安装 ...

  8. spring服务器接收参数格式

    注:@RequestParam 或@RequestBody等注解是否添加有什么区别 不加:参数可有可无,无参数时为null,但当参数类型是 数字基本类型(int.double)时会报错: 加上@Req ...

  9. 十一、Boostrap-X-editable

    一.官网 http://vitalets.github.io/x-editable/index.html 二.实践 在jQuery中ajax配置项中的使用type与method的区别: type 和m ...

  10. Python自动化学习--元素定位

    from selenium import webdriver import time driver = webdriver.Chrome() driver.get("https://www. ...