标签:20170427
一、awk工具的使用head -2 /etc/passwd |awk -F ‘:‘ ‘{print $1}‘
[root@riven ~]# head -2 /etc/passwd |awk -F ‘:‘ ‘{print $1}‘
root
bin
[root@riven ~]# ^C
-F 指定分隔符,如果不加-F指定,则以空格或者tab为分隔符
$1 第1字段,$2第2字段,$0表示整行
print 打印,print的动作要用 { } 括起来,它还可以打印自定义的内容。但自定义的内容要用双引号引起来。例:
head -2 /etc/passwd |awk -F ‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘
[root@riven ~]# head -2 /etc/passwd |awk -F ‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘
root#x#0#0
bin#x#1#1
[root@riven ~]#
例:awk ‘/ro/‘ 1.txt 匹配ro字符
awk -F ‘:‘ ‘$! ~/oo/‘ 1.txt ~是匹配的意思
awk -F ‘:‘ ‘/root/ {print $1,$3} /test/ {print $1,$3}‘ /etc/passwd
[root@riven ~]# awk -F ‘:‘ ‘/root/ {print $1,$3} /test/ {print $1,$3}‘ /etc/passwd
root 0
operator 11
test 1003
[root@riven ~]#
多次匹配,匹配完root,再匹配test,它还可以只打印所匹配的段
awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,
awk -F ‘:‘ ‘$3="0"‘ /etc/passwd
[root@riven ~]# awk -F ‘:‘ ‘$3=="0"‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@riven ~]#
在和数字比较时,若把比较的数字用双引号引起来后,那么awk会认为是字符,不加双引号则认为是数字。
例:
awk -F ‘:‘ ‘$3 >=500‘ /etc/passwd 打印UID大于或等于500的行
[root@riven ~]# awk -F ‘:‘ ‘$3 >=500‘ /etc/passwd
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
riven:x:1000:1000::/home/riven:/bin/bash
test:x:1003:1001::/home/test:/bin/bash
user2:x:1004:1004::/home/user2:/bin/bash
httpd:x:1005:1012::/home/httpd:/bin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]# awk -F ‘:‘ ‘$3 >="500"‘ /etc/passwd
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
tcpdump:x:72:72::/:/sbin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]#
!= 为不匹配,例:awk -F ‘:‘ ‘$7!="/sbin/nologin"‘ /etc/passwd 不匹配/sbin/nologin ,
[root@riven ~]# awk -F ‘:‘ ‘$7!="/sbin/nologin"‘ /etc/passwd
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
riven:x:1000:1000::/home/riven:/bin/bash
test:x:1003:1001::/home/test:/bin/bash
user2:x:1004:1004::/home/user2:/bin/bash
httpd:x:1005:1012::/home/httpd:/bin/nologin
[root@riven ~]#
除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较。
例:awk -F ‘:‘ ‘$3<$4‘ /etc/passwd 第三个字符小于第四个字符的项。
[root@riven ~]# awk -F ‘:‘ ‘$3<$4‘ /etc/passwd
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
httpd:x:1005:1012::/home/httpd:/bin/nologin
[root@riven ~]# awk -F ‘:‘ ‘$4<$3‘ /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
test:x:1003:1001::/home/test:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]#
&& 和 || 表示 “并且” 和 “或者” 的意思。
[root@riven ~]# awk -F ‘:‘ ‘$3>"5" && $3<"7"‘ /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@riven ~]# awk -F ‘:‘ ‘$3>"3" && $3<"7"‘ /etc/passwd
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
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@riven ~]# awk -F ‘:‘ ‘$3>"3" || $7<"/bin/bash"‘ /etc/passwd
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
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
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]#
awk常用的变量有:
NF :用分隔符分隔后一共有多少段
NR :行数
[root@riven ~]# head -2 /etc/passwd | awk -F ‘:‘ ‘{print NF}‘
7
7
[root@riven ~]# head -2 /etc/passwd | awk -F ‘:‘ ‘{print $NF}‘
/bin/bash
/sbin/nologin
[root@riven ~]# head -2 /etc/passwd | awk -F ‘:‘ ‘{print $NR}‘
root
x
[root@riven ~]# head -2 /etc/passwd | awk -F ‘:‘ ‘{print NR}‘
1
2
[root@riven ~]#
NF 是多少段,而$NF是最后一段的值, 而NR则是行号。$NR对应的是:行号是几显示的就是第几个段的字符。
awk可以把段值更改:
例: head -n 3 /etc/passwd |awk -F ‘:‘ ‘$1="root"‘
[root@riven ~]# head -n 3 /etc/passwd |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@riven ~]# head -n2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@riven ~]# head -n2 /etc/passwd |awk -F ‘:‘ ‘{$7=$3+$4}‘
[root@riven ~]# head -n2 /etc/passwd |awk -F ‘:‘ ‘{$7=$3+$4; print $0}‘
root x 0 0 root /root 0
bin x 1 1 bin /bin 2
[root@riven ~]#
可以计算某个段的总和:
[root@riven ~]# awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ /etc/passwd #END 表示所有的行都已经执行
7800
[root@riven ~]#
在awk中使用if判断、for循环:
[root@riven ~]# awk -F ‘:‘ ‘{if ($1=="root") print $0}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@riven ~]#
标签:20170427
原文地址:http://blog.51cto.com/10690709/2108731