正则介绍_awk

10月18日任务mysql

9.6/9.7 awksql

 

awk工具

较grep、sed工具功能更丰富,能够分段操做c#

基本使用

  • 按段操做
# -F 指定分隔符,默认为空格

{}内的
# $1表示:分割后的第一个字段
# $0表示一行
# 打印内容的第一段
[root@centos7 tmp]# head test.txt | awk -F ':' '{ print $1}' 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

# 打印整行
[root@localhost ~]# head test.txt | awk -F ":" '{print $0}' 
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
operator:x:11:0:operator:/root:/sbin/nologin
  • 针对段来匹配
# ~ + 匹配内容(不用加\转义)
[root@centos7 tmp]# head test.txt | awk -F ':' '$1 ~ /root/'  
root:x:0:0:root:/root:/bin/bash
  • 匹配多个条件
[root@centos7 tmp]# awk -F ':' '/root/ {print $1,$3} /mail/ {print$1,$3,$4}' test.txt 
root 0
mail 8 12
operator 11

# 指定分隔符,打印输出格式一致
[root@centos7 tmp]# awk -F ':' '/root|mail/ {print $1,$3}' test.txt 
root 0
mail 8
operator 11

# 指定分隔符,打印输出格式不一样,同时指定输出分割符
[root@localhost ~]# awk -F ':' '/root/ {print $1,"#",$3} /mail/ {print$1,"#",$3,"#",$4}' /etc/passwd
root # 0
mail # 8 # 12
operator # 11
  • 条件判断

针对字符串的条件须要加上双引号,这时会以字符串序排序;要以数字排序就不要加双引号。可用的条件判断符号包括:> >= < <= == !=centos

# 单个字段条件判断
[root@centos7 tmp]# awk -F ':' '$3>=1000' test.txt 
castiel:x:1000:1000::/home/castiel:/bin/bash

[root@centos7 tmp]# awk -F ':' '$3>=1000 {print $1}' test.txt 
castiel

# == 相等(字段间比较)
[root@centos7 tmp]# awk -F ':' '$3==$4' test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
castiel:x:1000:1000::/home/castiel:/bin/bash

# != 不等于
[root@localhost ~]# awk -F ':' '$7!="/sbin/nologin" {print $1}' test.txt
root
sync
shutdown
halt
castiel

# 使用 && 或 || 来实现多条件判断
[root@localhost ~]# awk -F ':' '$7!="/sbin/nologin" && $3==$4' /etc/passwd
root:x:0:0:root:/root:/bin/bash
mysql:x:1000:1000::/home/mysql:/bin/bash
  • 使用条件语句
[root@centos7 tmp]# awk -F ':' '{OFS="#"}{if ($3>=1000) {print $1,$3,$4}}' test.txt 
castiel#1000#1000

内置变量

# OFS 表示输出分隔符
[root@centos7 tmp]# head test.txt |awk -F ':' '{OFS="#"} {print $1,$3,$4}'
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
sync#5#0
shutdown#6#0
halt#7#0
mail#8#12
operator#11#0

# NR: 行数,使用$NR就对应表示$一、$2...
[root@centos7 tmp]# awk -F ':' '{print NR,$0}' test.txt | head 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin

# NF表示每行的段数,这里NF的值为7,因此$NF等价于$7
[root@localhost ~]# awk -F ':' '{print NR,$NF}' test.txt | head
1 /bin/bash
2 /sbin/nologin
3 /sbin/nologin
4 /sbin/nologin
5 /sbin/nologin
6 /bin/sync
7 /sbin/shutdown
8 /sbin/halt
9 /sbin/nologin
10 /sbin/nologin
  • 赋值:使用=,与==不一样的是,它的输出将没有分隔符,这时须要使用OFS指定
[root@centos7 tmp]# head -n 3 test.txt | awk -F ':' '{OFS=":"} $1="root"'
root:x:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin

扩展使用:END块

# 计算第三段的数字之和
[root@localhost ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
4661
相关文章
相关标签/搜索