awk(上下)(分段,有规律的文件,分段去匹配,不更改文本内容)
head -n2 test.txt|awk -F ':' '{print $1}'
head -n2 test.txt|awk -F ':' '{print $0}'
awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
awk '/oo/' test.txt
awk -F ':' '$1 ~/oo/' test.txt
awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt 包含root的行的第1,第3段 包含test第1,第3段
awk -F ':' '$3=="0"' /etc/passwd
awk -F ':' '$3>="500"' /etc/passwd
awk -F ':' '$3>=500' /etc/passwd
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
指定分割符-F '{print $段数}' 指定打印的段
[root@test ~]# head passwd3|awk -F ':' '{print $1}'
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
打印所有的段 {print $0} $0表示所有的段 相当于cat功能,可以不指定分割符
[root@test ~]# awk -F ':' '{print $0}' passwd3
不指定分割符则以空格为分割
[root@test ~]# awk '{print $1}' 4.txt
1
aa
dsad,dsadsa
[root@test ~]# cat 4.txt
1 2
aa bb
dsad,dsadsa dasdasda,dsadsad
打印多个段 '{print $1,$3,$4}'
[root@test ~]# head passwd3|awk -F ':' '{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
指定打印出来的段以指定分隔符分割 '{print $1"%"$3"#"$4}' 段之间用双引号引起来并且指定符号
[root@test ~]# head passwd3|awk -F ':' '{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
匹配功能
[root@test ~]# awk '/oo/' passwd3
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin
匹配指定的段中有指定的字符,打印此行 '$1 ~ /oo/'表示第一段中含有00字符
[root@test ~]# awk -F ':' '$1 ~ /oo/' passwd3
root:x:0:0:root:/root:/bin/bash
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin
正则表达式 (不需要加脱义字符)
第一段中有o字符匹配
[root@test ~]# awk -F ':' '$1 ~ /o+/' passwd3
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
geoclue:x:996:992:User for geoclue:/var/lib/geoclue:/sbin/nologin
unbound:x:993:990:Unbound DNS resolver:/etc/unbound:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
colord:x:992:986:User for colord:/var/lib/colord:/sbin/nologin
gnome-initial-setup:x:991:985::/run/gnome-initial-setup/:/sbin/nologin
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin
[root@test ~]# awk -F ':' '$1 ~ /oo+/' passwd3
root:x:0:0:root:/root:/bin/bash
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin
多个表达式同时实现()
满足有关键词root的行打印第一段和第二段,有关键词ssh打印第六段第七段
[root@test ~]# awk -F ':' '/root/ {print $1,$2} /ssh/ {print $6,$7}' passwd3
root x
operator x
/var/empty/sshd /sbin/nologin
[root@test ~]# awk -F ':' '/root/ {print $1,$2} /ar+/ {print $6,$7}' passwd3
root x
/var/adm /sbin/nologin
/var/spool/lpd /sbin/nologin
/var/spool/mail /sbin/nologin
operator x
/var/ftp /sbin/nologin
/var/spool/postfix /sbin/nologin
/var/empty/sshd /sbin/nologin
/var/lib/chrony /sbin/nologin
/var/lib/rpcbind /sbin/nologin
/var/lib/geoclue /sbin/nologin
/var/run/gluster /sbin/nologin
/var/run/pulse /sbin/nologin
/var/lib/nfs /sbin/nologin
/var/lib/nfs /sbin/nologin
/var/lib/colord /sbin/nologin
/var/lib/gdm /sbin/nologin
/var/run/avahi-daemon /sbin/nologin
/var/lib/setroubleshoot /sbin/nologin
验证:[root@test ~]# egrep 'root|ar+' passwd3
[root@test ~]# awk -F ':' '/root|ar+/ {print $0}' passwd3
数学表达式匹配
等于需要写两个等于号
[root@test ~]# awk -F ':' '$3==0' passwd3
root:x:0:0:root:/root:/bin/bash
[root@test ~]# awk -F ':' '$3==0 {print $0}' passwd3
root:x:0:0:root:/root:/bin/bash
[root@test ~]# awk -F ':' '$3==0 {print $1}' passwd3
root
[root@test ~]# awk -F ':' '$3==0 {print $1 $3}' passwd3
root0
[root@test ~]# awk -F ':' '$3==0 {print $1"#" $3}' passwd3
root#0
大于等于>=
[root@test ~]# awk -F ':' '$3>=500 {print $1"#" $3}' passwd3
systemd-bus-proxy#999
polkitd#998
chrony#997
geoclue#996
saslauth#995
gluster#994
unbound#993
nfsnobody#65534
colord#992
gnome-initial-setup#991
setroubleshoot#990
数值加上双引号则使用ASCII码排序
[root@test ~]# awk -F ':' '$3>="500" {print $1"#" $3}' passwd3
shutdown#6
halt#7
mail#8
nobody#99
systemd-bus-proxy#999
dbus#81
polkitd#998
tss#59
postfix#89
sshd#74
chrony#997
geoclue#996
radvd#75
saslauth#995
gluster#994
unbound#993
nfsnobody#65534
colord#992
gnome-initial-setup#991
avahi#70
setroubleshoot#990
小于等<=
[root@test ~]# awk -F ':' '$3<=100 {print $1"#" $3}' passwd3
root#0
bin#1
daemon#2
adm#3
lp#4
sync#5
shutdown#6
halt#7
mail#8
operator#11
games#12
ftp#14
nobody#99
dbus#81
tss#59
postfix#89
sshd#74
rpc#32
radvd#75
rpcuser#29
gdm#42
avahi#70
不等于!= 字符串时需要加双引号
[root@test ~]# awk -F ':' '$7!="/sbin/nologin" {print $0}' passwd3
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
awk -F ':' '$3<$4' /etc/passwd
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
head -n3 /etc/passwd | awk -F ':' '{print NF}‘
head -n3 /etc/passwd | awk -F ':' '{print NR}‘
awk 'NR>40' /etc/passwd
awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd tot=tot+$3 意思是,新的tot的值,为旧的tot的值和$3的值的和
awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd
两个字段比较
[root@test ~]# awk -F ':' '$3<$4' passwd3
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@test ~]# awk -F ':' '$3==$4' passwd3
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
abrt:x:173:173::/etc/abrt:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
&&并且段同时满足条件
[root@test ~]# awk -F ':' '$3>"5" && $3<"7"' passwd3 ASCII码排序
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@test ~]# awk -F ':' '$3>5 && $3<7' passwd3 纯数字比较
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
||或者功能,满足一个条件或者所有条件都满足
[root@test ~]# awk -F ':' '$3>1000 || $7=="/sbin/nologin"' passwd3
~匹配关键词
[root@test ~]# awk -F ':' '$3>1000 || $7 ~ /bash/' passwd3
root:x:0:0:root:/root:/bin/bash
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
OFS内置变量,-F指定分段前的分割符,OFS指定print时候用的分隔符
[root@test ~]# head -n15 passwd3 | awk -F ':' '{OFS="*"} $3>800 || $7 ~ /bash/ {print $1,$3,$7}'
root*0*/bin/bash
systemd-bus-proxy*999*/sbin/nologin
定义条件和打印的段写在一起 {if ($3>1000) {print $1,$2,$3,$4}将条件一起写入用大括号括起来变为一个整体 (比较正统)
[root@test ~]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' passwd3
nfsnobody#x#65534#65534
内置变量 NR 表示行 NF表示段 都为数字
打印行号 print NR":"$0 每个行前面加行号 冒号 内容
[root@test ~]# awk -F ':' '{print NR":"$0}' passwd3
打印出每行有多少段,打印在行前面 print NF":"$0
[root@test ~]# awk -F ':' '{print NF":"$0}' passwd3
NR/NF作为判断条件
前十行打印
[root@test ~]# awk -F ':' 'NR<=10' passwd3
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或者shutdown关键词
[root@test ~]# awk -F ':' 'NR<=10 && $1 ~ /root|shutdown/' passwd3
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
段满足要求
[root@test ~]# awk -F ':' 'NF==7 && $1 ~ /root|shutdown/' passwd3
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
print $NR"#"$NF $NR表示第一行打印第一段,第二行打印第二段以此类推, $NF打印每一行打印按照段数的第几段,这里都是7段所以所有行打印第七段
[root@test ~]# awk -F ':' '{print $NR"#"$NF}' passwd3
root#/bin/bash
x#/sbin/nologin
2#/sbin/nologin
4#/sbin/nologin
lp#/sbin/nologin
/sbin#/bin/sync
/sbin/shutdown#/sbin/shutdown
#/sbin/halt
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
#/sbin/nologin
将指定段赋值 '$1="root"' 单独一个等于叫做赋值
[root@test ~]# head -n3 passwd3 |awk -F ':' '$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
[root@test ~]# head -n3 passwd3 |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
tot求和 tot=tot+$3 每次循环第三段值相加, 起始位0,第一次循环是0加第一行的$3 第二次循环是第一行的$3加第二行的$3 以此类推,求和一列
[root@test ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' passwd3
77130