awk模式pattern

再来回顾下awk的语法

awk [option] 'pattern[action]'  file ...

awk是按行处理文本,刚才讲解了print动作,现在讲解特殊的pattern:BEGIN和END

  • BEGIN模式是处理文本之前需要执行的操作
  • END模式是处理完所有行之后执行的操作
[root@pylinux tmp]# awk 'BEGIN{print "超哥教你学awk"}'
超哥教你学awk #上述操作没有指定任何文件作为数据源,而是awk首选会执行BEGIN模式指定的print操作,打印出如上结果,然后发现没有任何文件需要操作,就结束了
[root@pylinux tmp]# awk 'BEGIN{print "超哥带你学awk"}{print $1}' alex.txt
超哥带你学awk
alex1
alex6
alex11
alex16
alex21
alex26
alex31
alex36
alex41
alex46

  • 再次总结,BEGIN就是处理文本前,先执行BEGIN模式指定的动作
  • 再来看END的作用(awk处理完所有指定的文本后,需要执行的动作)

awk结合BEGIN和END模式

[root@pylinux tmp]# awk 'BEGIN{print "来路飞学城听超哥讲linux"}{print $1,$2}END{print "超哥nb"}' alex.txt

awk模式pattern讲解

再来看一下awk的语法,模式也可以理解为是条件

awk [option] 'pattern[action]'  file ...

刚才我们学了两个模式(条件)

  • BEGIN
  • END

awk默认是按行处理文本,如果不指定任何模式(条件),awk默认一行行处理

如果指定了模式,只有符合模式的才会被处理

模式(条件)案例

[root@pylinux tmp]# cat -n alex.txt
1 alex1 alex2 alex3 alex4 alex5
2 alex6 alex7 alex8 alex9 alex10
3 alex11 alex12 alex13 alex14 alex15
4 alex16 alex17 alex18 alex19 alex20
5 alex21 alex22 alex23 alex24 alex25
6 alex26 alex27 alex28 alex29 alex30
7 alex31 alex32 alex33 alex34 alex35
8 alex36 alex37 alex38 alex39 alex40
9 alex41 alex42 alex43 alex44 alex45
10 alex46 alex47 alex48 alex49 alex50 alex51
[root@pylinux tmp]#
[root@pylinux tmp]#
[root@pylinux tmp]# awk 'NF==5 {print $1}' alex.txt
alex1
alex6
alex11
alex16
alex21
alex26
alex31
alex36
alex41
[root@pylinux tmp]# awk 'NF==6 {print $1}' alex.txt
alex46

awk的模式

关系运算符 解释 示例
< 小于 x<y
<= 小于等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大于等于 x>=y
> 大于 x>y
~ 匹配正则 x~/正则/
!~ 不匹配正则 x!~/正则/

案例

[root@pylinux tmp]# awk 'NR>3{print $0}' alex.txt
alex16 alex17 alex18 alex19 alex20
alex21 alex22 alex23 alex24 alex25
alex26 alex27 alex28 alex29 alex30
alex31 alex32 alex33 alex34 alex35
alex36 alex37 alex38 alex39 alex40
alex41 alex42 alex43 alex44 alex45
alex46 alex47 alex48 alex49 alex50 alex51
[root@pylinux tmp]#
[root@pylinux tmp]# awk '$1=="alex36"{print $0}' alex.txt
alex36 alex37 alex38 alex39 alex40

awk基础总结

  • 空模式,没有指定任何的模式(条件),因此每一行都执行了对应的动作,空模式会匹配文档的每一行,每一行都满足了(空模式)
[root@pylinux tmp]# awk '{print $1}' alex.txt
alex1
alex6
alex11
alex16
alex21
alex26
alex31
alex36
alex41
alex46
  • 关系运算符模式,awk默认执行打印输出动作
[root@pylinux tmp]# awk 'NR==2,NR==5' alex.txt
alex6 alex7 alex8 alex9 alex10
alex11 alex12 alex13 alex14 alex15
alex16 alex17 alex18 alex19 alex20
alex21 alex22 alex23 alex24 alex25
  • BEGIN/END模式(条件设置)

awk与正则表达式

正则表达式主要与awk的pattern模式(条件)结合使用

  • 不指定模式,awk每一行都会执行对应的动作
  • 指定了模式,只有被模式匹配到的、符合条件的行才会执行动作

找出pwd.txt中有以games开头的行

1.用grep过滤

[root@pylinux tmp]# cat -n pwd.txt
1 sync:x:5:0:sync:/sbin:/bin/sync
2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
3 halt:x:7:0:halt:/sbin:/sbin/halt
4 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
5 operator:x:11:0:operator:/root:/sbin/nologin
6 games:x:12:100:games:/usr/games:/sbin/nologin
7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
8 nobody:x:99:99:Nobody:/:/sbin/nologin
9 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
10 dbus:x:81:81:System message bus:/:/sbin/nologin
11 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
12 libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
13 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
14 ntp:x:38:38::/etc/ntp:/sbin/nologin [root@pylinux tmp]# grep '^games' pwd.txt
games:x:12:100:games:/usr/games:/sbin/nologin

2.awk怎么办?

[root@pylinux tmp]# awk '/^games/{print $0}'  pwd.txt
games:x:12:100:games:/usr/games:/sbin/nologin #省略写法
[root@pylinux tmp]# awk '/^games/' pwd.txt
games:x:12:100:games:/usr/games:/sbin/nologin

awk使用正则语法

awk命令使用正则表达式,必须把正则放入 "//" 双斜杠中,匹配到结果后执行动作{print $0},打印整行信息

grep可以过滤,那我还用你awk干啥?

awk强大的格式化文本

[root@pylinux tmp]# awk -F ":"  'BEGIN{printf "%-10s\t%-10s\n","用户名","用户id"} /^n/ {printf "%-10s\t%-10s\n",$1,$3}' pwd.txt
用户名 用户id
nobody 99
ntp 38
nawerwertp 38
nqwerqstp 38
nqweqsdtp 38
nqwetp 38

awk命令执行流程

解读需求:从pwd.txt文件中,寻找我们想要的信息,按照以下顺序执行

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
  1. 优先执行BEGIN{}模式中的语句
  2. 从pwd.txt文件中读取第一行,然后执行pattern{commands}进行正则匹配/^n/ 寻找n开头的行,找到了执行{print} 进行打印
  3. 当awk读取到文件数据流的结尾时,会执行END{commands}

找出pwd.txt文件中禁止登录的用户(/sbin/nologin)

正则表达式中如果出现了 "/"则需要进行转义

找出pwd.txt文件中禁止登录的用户(/sbin/nologin)

1.用grep找出

grep '/sbin/nologin$' pwd.txt

2.awk用正则得用双斜杠/正则表达式/

[root@pylinux tmp]# awk '/\/sbin\/nologin$/{print $0}' pwd.txt

找出文件的区间内容

1.找出mail用户到nobody用户之间的内容

[root@pylinux tmp]# awk '/^mail/,/^nobody/ {print $0}' pwd.txt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

2.关系表达式模式

[root@pylinux tmp]# awk 'NR>=4 && NR<=8 {print $0}' pwd.txt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

awk企业实战nginx日志

Access.log

39.96.187.239 - - [11/Nov/2019:10:08:01 +0800] "GET / HTTP/1.1" 302 0 "-" "Zabbix"
211.162.238.91 - - [11/Nov/2019:10:08:02 +0800] "GET /api/v1/course_sub/category/list/?belong=1 HTTP/1.1" 200 363 "https://www.luffycity.com/free" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
211.162.238.91 - - [11/Nov/2019:10:08:02 +0800] "GET /api/v1/degree_course/ HTTP/1.1" 200 370 "https://www.luffycity.com/free" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

统计日志的访客ip数量

#sort -n 数字从大到小排序
#wc -l 统计行数,也就是ip的条目数
[root@pylinux tmp]# awk '{print $1}' 500access.log |sort -n|uniq|wc -l
75

查看访问最频繁的前10个ip

#uniq -c 去重显示次数
#sort -n 从大到小排序 1.先找出所有ip排序,排序,然后去重统计出现次数
awk '{print $1}' 500access.log |sort -n |uniq -c 2.再次从大到小排序,且显示前100个ip
[root@pylinux tmp]# awk '{print $1}' 500access.log |sort -n |uniq -c |sort -nr |head -10
32 113.225.0.211
22 119.123.30.32
21 116.30.195.155
20 122.71.65.73
18 163.142.211.160
16 39.96.187.239
16 124.200.147.165
16 101.249.53.64
14 120.228.193.218
14 113.68.155.221

awk模式pattern的更多相关文章

  1. awk(2)-模式(pattern)

    在上文 awk(1)-简述我们将简要描述了awk的主要使用方向和构成(由一个或多个模式-动作组成),本小节主要讲述awk的各种模式. ps:例子中使用的输入文件(如countries)内容可由awk( ...

  2. awk 的 pattern(模式)

    我们知道, awk程序由一系列 pattern 以及与之对应的 action 组成的 rule 组成,rule之间用";"分号隔开, 一条输入记录与 pattern 匹配则执行与之 ...

  3. (转)关于 awk 的 pattern(模式)

    本文转自chinaunix http://bbs.chinaunix.net/thread-4246512-1-1.html   作者reyleon 我们知道, awk程序由一系列 pattern 以 ...

  4. Linux常用基本命令:三剑客命令之-awk模式用法(1)

    再次回顾一下,awk基本语法格式: awk [options] 'Pattern {Action}' file1 file2 ··· 之前的文章有讲过两种Pattern(BEGIN, END),本文, ...

  5. Linux shell awk模式使用

    awk的PATTERN表示方法: 1,正则表达式,格式为/regex/ 以冒号为分隔符,显示/etc/passwd以r开头的行的第一段 [root@wei awk]# awk -F: '/^r/{pr ...

  6. Redis Keys 命令 - 查找所有符合给定模式( pattern)的 key

    Redis Keys 命令用于查找所有符合给定模式 pattern 的 key .. 语法 redis KEYS 命令基本语法如下: redis 127.0.0.1:6379> KEYS PAT ...

  7. Awk 从入门到放弃 (6) Awk模式(Pattern)之二

    第一题:从/etc/passwd 匹配以 vmuser开头的用户 grep “^vmuser”   /etc/passwd  -r  -n awk  ‘/^vmuser /{print $0}’  / ...

  8. Awk 从入门到放弃(5)– Awk模式(Pattern)之一

    转:http://www.zsythink.net/archives/1426

  9. Linux常用基本命令:三剑客命令之-awk模式用法(2)

    1,正则模式,在/etc/passwd中 过滤出使用/bin/bash的用户 ghostwu@dev:~/linux/awk$ awk -v FS=":" 'BEGIN{print ...

随机推荐

  1. Redis 06 哈希

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 哈希就是 ke ...

  2. 【manim】3b1b的"Almost" Fourier Transform复刻

    最近在做Fourier Transform的内容,记录一下今天下午的成果. 本文代码全部自行编写,需要math and music项目完整工程可以在gayhub上获取.(现在还没弄完,就先不发了.) ...

  3. 【unity游戏入门】2 使用代码编写Hello Unity游戏

    作者 罗芭Remoo 2021年9月24日 第一章.许可证的安装 下载好Unity之后,我们还需要一个前置操作才可以进入Unity引擎----许可证. 当然不用担心,Unity是一个开放的引擎,一切以 ...

  4. 浅析websocket的基本应用spring boot + vue +C# + WPF

    1.基本概念 首先websocket是基于H5的一种通信.在网页中如果定时获取服务器端的实时数据,我们常采用long poll 和ajax轮询的方式.但是在轮询过程中,由于根本没有新数据的改变,而造成 ...

  5. Android蓝牙线控切歌、连接状态监听(无线耳机也适用)

    1. 监听蓝牙设备(音频)连接状态 所有代码已测试在Android11也能正常使用 (Android SDK 30) 首先新建一个广播类 BluetoothStateReceiver /** * @a ...

  6. helm安装csi-driver-nfs-v4.1.0

    Application version v4.1.0 Chart version v4.1.0 获取chart包 helm repo add csi-driver-nfs https://raw.gi ...

  7. KingbaseES V8R3集群运维案例之---用户自定义表空间管理

    ​案例说明: KingbaseES 数据库支持用户自定义表空间的创建,并建议表空间的文件存储路径配置到数据库的data目录之外.本案例复现了,当用户自定义表空间存储路径配置到data下时,出现的故障问 ...

  8. KingbaseES R6 集群物理copy方式手工添加新备库节点

    案例说明: 对于主库数据量比较大的环境,在添加新节点是可以采用在线clone方式创建新的备库节点,也可以在离线的状态下,直接拷贝其中一个备库的所有集群相关目录来创建新的备库节点.本案例介绍了通过离线物 ...

  9. filebeat客户端传输cisco日志到elasticsearch

    一.安装相应版本的filebeat wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.2-x86_64.r ...

  10. C++程序的内存分布

    4.文字常量区: p与p1的指针地址一致,且字符串常量是不能被改变的. 5.程序代码区:存放一系列代码. 动态内存 1.按需分配,根据需要分配内存,不浪费. 内存拷贝函数 void *memcpy(v ...