9.6/9.7 awk
-F表示指定分隔符
如果不用F,就是不指定分隔符,默认用空格或者空白为分隔符
head -n2 test.txt|awk -F ':' '{print $1}'
打印第一段(也不会更改文本内容)
[root@vultr awk]# awk -F ':' '{print $1}' passwd
root
bin
ROOT
rOOT
root
oooo
ooo
daemon
adm
lp
sync
[root@vultr awk]# awk -F ':' '{print $0}' passwd
$0表示所有的段
head -n2 test.txt|awk -F ':' '{print $0}'
打印几段的时候,用逗号分隔
[root@vultr awk]# awk -F ':' '{print $1,$2,$3}' passwd
root x 0
bin x 1
ROOT 999 sdfdf
rOOT dsd 112222
root 99 sdsd
oooo oooo 0
ooo oooooooo
daemon x 2
adm x 3
lp x 4
sync x 5
shutdown x 6
halt x 7
指定分割符为#号,必须用双引号
awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
匹配功能
awk '/oo/' test.txt
列出有oo的行
awk -F ':' '$1 ~/oo/' test.txt
列出第一段有oo的行
[root@vultr awk]# awk -F ':' '$1 ~ /o+/' passwd
root:x:0:0:root:/root:/bin/bash
root:99:sdsd
oooo:oooo:0:9
ooo:oooooooo
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-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
支持多个表达式一起写
awk -F ':' /root|user/ {print $0}' passwd
和写在一起
awk -F ':' '$3=="0"' /etc/passwd
awk -F ':' '$3>="500"' /etc/passwd
加了双引号表示的是字符串,而不是数字
awk -F ':' '$3>=500' /etc/passwd
不加双引号这是针对数字的大小
[root@vultr awk]# awk -F ':' '$3>="500"' passwd
ROOT:999:sdfdf
root:99:sdsd
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
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@vultr awk]# awk -F ':' '$3>=500' passwd
ROOT:999:sdfdf
rOOT:dsd:112222
root:99:sdsd
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
xqiang1:x:1000:1000::/home/xqiang1:/bin/bash
xqiang:x:1001:1001::/home/xqiang:/bin/bash
user1:x:1002:1003::/home/user1:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
字段间的比较
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
awk -F ':' '$3<$4' /etc/passwd
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
[root@vultr awk]# awk -F ':' '$3>"5" && $3<"7"' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
||表示或者
awk -F ':' '$3>1000 || $7 ~ /bin/bash' passwd
[root@vultr awk]# awk -F ':' '$3>1000 || $7 ~ /bin/bash' passwd
ROOT:999:sdfdf
rOOT:dsd:112222
root:99:sdsd
xqiang:x:1001:1001::/home/xqiang:/bin/bash
user1:x:1002:1003::/home/user1:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
head -5 passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}'
OFS 表示 print 显示的分隔符
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /passwd
[root@vultr awk]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' passwd
ROOT#999#sdfdf#
rOOT#dsd#112222#
root#99#sdsd#
xqiang#x#1001#1001
user1#x#1002#1003
user3#x#1004#1004
NR 表示当前表示的行是第几行, NF 表示当前行有几段
head -n3 passwd | awk -F ':' '{print NF}'
[root@vultr awk]# head -n3 passwd | awk -F ':' '{print NF}'
7
7
3
[root@vultr awk]# head -n3 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ROOT:999:sdfdf
head -n3 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
把文件所有行的第3段加起来
awk -F ':' '{if ($1=="root") {print $0}}' passwd
如果第一段=root,就显示出一整行