正則介紹_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
相關文章
相關標籤/搜索