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)擅长统计分析数据信息

[root@centos71 test]# cat  awk.txt
#!/bin/awk
[root@centos71 test]# file awk.txt
awk.txt: awk script, ASCII text executable
[root@centos71 test]# cat python
#!/bin/python
[root@centos71 test]# file python
python: a /bin/python script, ASCII text executable

二awk命令操作

空格和制表符是有区别的

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

对文件对齐

[root@centos71 test]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 41922560 3010792 38911768 8% /
devtmpfs 487064 0 487064 0% /dev
tmpfs 497960 0 497960 0% /dev/shm
tmpfs 497960 7924 490036 2% /run
tmpfs 497960 0 497960 0% /sys/fs/cgroup
/dev/sda1 201380 107080 94300 54% /boot
tmpfs 99596 0 99596 0% /run/user/0
[root@centos71 test]# df | column -t
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 41922560 3010792 38911768 8% /
devtmpfs 487064 0 487064 0% /dev
tmpfs 497960 0 497960 0% /dev/shm
tmpfs 497960 7924 490036 2% /run
tmpfs 497960 0 497960 0% /sys/fs/cgroup
/dev/sda1 201380 107080 94300 54% /boot
tmpfs 99596 0 99596 0% /run/user/

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

根据条件找出相应行

[root@centos71 test]# cat  awk.txt
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 [root@centos71 test]# awk '/Xiaoyu/{print $0}' awk.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@centos71 test]# awk '/Xiaoyu/' awk.txt
Zhang Xiaoyu 390320151 :155:90:

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

注意只能使用双引号

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

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

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

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

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

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

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

根据条件找出相应行

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

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

[root@centos71 test]# cat  awk.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75 Xiaoai
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 [root@centos71 test]# awk -F "[ :]+" '$1~/Zhang/{print $1,$2,$5}' awk.txt
Zhang Dandan 100
Zhang Xiaoyu

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

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

[root@centos61 ~]# awk -F   "#| "  '{print  $1,$3}' /etc/selinux/config 

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

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

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

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

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

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

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

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

换行显示

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

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

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

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

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

awk替换信息方法

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

二awk命令高级用法

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

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

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

[root@centos71 test]# awk  'BEGIN{print"姓","名","id","金额"}{print $0}' awk.txt
姓 名 id 金额
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75 Xiaoai
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:
[root@centos71 test]# awk  'BEGIN{print"姓","名","id","金额"}{print $0}' awk.txt |  column -t
姓 名 id 金额
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75 Xiaoai
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

(二)进行四则运算

[root@centos71 ~]# awk 'BEGIN{print 2+2}'
4
[root@centos71 ~]# awk 'BEGIN{print 2-2}'
0
[root@centos71 ~]# awk 'BEGIN{print 2*2}'
4
[root@centos71 ~]# awk 'BEGIN{print 2/2}'

(三)进行变量设定

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

[root@centos71 ~]# awk  'BEGIN{name=wang;print  name}'

[root@centos71 ~]# awk  'BEGIN{name="wang";print  name}'
wang

内置变量NR表示行号信息

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

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

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

FS : 表示分隔符字段信息

[root@centos61 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 50264772 910576 46794196 2% /
tmpfs 502068 0 502068 0% /dev/shm
/dev/sda3 20027260 44992 18958268 1% /app
/dev/sda1 999320 30508 916384 4% /boot
[root@centos61 ~]# df | awk -v FS=" " '{print $1,$5}'
Filesystem Use%
/dev/sda2 2%
tmpfs 0%
/dev/sda3 1%
/dev/sda1 4%
[root@centos61 ~]# df | awk -v FS=" " '{print $1,$5}' | column -t
Filesystem Use%
/dev/sda2 2%
tmpfs 0%
/dev/sda3 1%
/dev/sda1 4%

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

[root@centos61 ~]# awk     '/sbin/{i=i+1}END{print i}'   /etc/passwd
21
[root@centos61 ~]# grep sbin /etc/passwd | wc
21 27
[root@centos71 ~]# grep  "sbin"   /etc/passwd -o
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
sbin
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

[root@centos61 ~]# seq  10  >  seq.txt
[root@centos61 ~]# cat seq.txt
1
2
3
4
5
6
7
8
9
10
[root@centos61 ~]# awk '{i=i+$1; print i}' seq.txt
1
3
6
10
15
21
28
36
45
55
[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. C#爬虫之Senlium

    在爬虫过程中,有的网页是动态更新的,有的数据会在页面加载时通过js加载或者用ajax加载,这时候如果只用普通的Request和Response获取的HTML页面将会不完整.所以这时候可以采用Senli ...

  2. UVA11987 带删除并查集

    1~n,n个数,初始每个数独自作为一个集合,然后进行m次操作.操作有三种:1 p q :把 p 所在的集合合并到 q 所在的集合 2 p q :把 p 从 p 的集合中拿出,放到 q 的集合里 3 p ...

  3. Go语言入门篇-基本数据类型

    一.程序实体与关键字 任何Go语言源码文件都由若干个程序实体组成的.在Go语言中,变量.常量.函数.结构体和接口被统称为“程序实体”,而它们的名字被统称为“标识符”. 标识符可以是任何Unicode编 ...

  4. mysql 恢复数据时中文乱码

    mysql恢复数据时中文乱码,解决办法. 用source命令导入mysql数据库怎么设置中文编码 1.导出数据时指定编码在导出mysql sql执行文件的时候,指定一下编码格式: mysqldump ...

  5. 记一次有趣的JsonFormat不生效问题

    dto中使用了JsonFormat注解,如图 然后再序列化时 objectMapper.writeValueAsString(printReceBillVO) 始终值是一个Long,最后发现是包引用错 ...

  6. JS案例经验1

    一 可以通过设置在一个div中的多个div的定位属性为absolute,从而使得这几个元素重叠.他们都脱离了标准流. 二 对于absolute的left和right属性,当left和right同时出现 ...

  7. [LeetCode] 203. 移除链表元素

    题目链接:https://leetcode-cn.com/problems/remove-linked-list-elements/ 题目描述: 删除链表中等于给定值 val 的所有节点. 示例: 输 ...

  8. 前端UI库推荐(pc和移动)

    此推荐个人喜好,不喜勿喷. 1. pc 端 elementUI (生态强大,样式生硬) iview (推荐,组件丰富) bootStrap layUI easyUi 2. 移动端 mintUI ant ...

  9. MySQL第一讲 一一一一 数据库入门

    一. MySQL简介与安装 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方 ...

  10. JavaScript的循环结构和经典题目

    一.JS中的循环结构 循环结构的执行步骤1.声明循环变量:2.判断循环条件;3.执行循环体操作:4.更新循环变量:5.然后循环执行2-4,直到条件不成立,跳出循环. while循环()中的表达式,运算 ...