RHEL6基础三十一之服务器维护基础命令②awk

格式:awk -F '[分隔符]' '{pattern + action}' filename[s]

工作方式:awk对指定filename[s]逐行扫描,从第一行到最后一行,读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,每个域部分再进行各种分析处理,寻找匹配的特定模式的行。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

说明:awk是一个强大的文本分析工具,用于在linux/unix下对文本和数据进行处,awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本;模式pattern可以是正则表达式、关系表达式、模式匹配表达式;操作action由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,

BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

END:让用户在最后一条输入记录被读取之后发生的动作

print函数的参数可以是变量、数值或者字符串。自定义的内容如字符串、分隔符必须用双引号引用,逗号不用双引号输出为空格

内建变量FS保存输入域分隔符的值,默认是空格或tab。可以通过-F命令行选项修改FS的值。可以同时使用多个域分隔符,此时需把分隔符放到方括号中,如$awk -F'[:/t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符

[root@justin ~]# touch /home/last
[root@justin ~]# last -n 5 > !$
last -n 5 > /home/last
[root@justin ~]# cat /home/last
root     pts/010.15.72.73      Thu Nov 21 16:45   still logged in
reboot   system boot  2.6.32-279.el6.i Thu Nov 21 16:45 - 15:46  (23:01)
root     pts/010.15.72.73      Mon Nov 18 11:02 - down  (1+21:13)
reboot   system boot  2.6.32-279.el6.i Mon Nov 18 10:23 - 08:16 (1+21:53)
root     pts/010.15.72.73      Fri Nov 15 15:27 - down   (02:09)
wtmp begins Wed Nov 13 17:30:52 2013
[root@justin ~]# awk '{print $3}' /home/last
10.15.72.73
boot
10.15.72.73
boot
10.15.72.73
Wed
[root@justin ~]# tail -5 /etc/passwd|awk -F ':' '{print $1}'
nfsnobody
abrt
sshd
tcpdump
justin
[root@justin ~]# tail -5 /etc/passwd|awk -F':' '{print $1"\t"$7}'
nfsnobody   /sbin/nologin
abrt    /sbin/nologin
sshd    /sbin/nologin
tcpdump /sbin/nologin
justin  /bin/bash
[root@justin ~]#

显示/etc/passwd最后5个账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"justin1,/bin/nosh"。

[root@justin ~]# tail -5 /etc/passwd|awk -F : 'BEGIN {print "name,shell"} {print $1","$7} END {print "justin1,/bin/nosh"}'
name,shell
nfsnobody,/sbin/nologin
abrt,/sbin/nologin
sshd,/sbin/nologin
tcpdump,/sbin/nologin
justin,/bin/bash
justin1,/bin/nosh
[root@justin ~]# tail -5 /etc/passwd|awk -F : 'BEGIN {print "name,shell"} {print $1 , $7} END {print "justin1,/bin/nosh"}'
name,shell
nfsnobody /sbin/nologin
abrt /sbin/nologin
sshd /sbin/nologin
tcpdump /sbin/nologin
justin /bin/bash
justin1,/bin/nosh

环境变量:

NF:当前记录已经浏览域的个数,awk把每一个以换行符结束的行称为一个记录,默认的输入和输出的记录分隔符都是回车,保存在内建变量ORS和RS中。

NR:已读的记录数,每处理完一条记录,NR的值就增加1

$n:当前行的第n个域,域间由分隔符隔开,$1表示当前行第一个域,$2表示第二个域,$0表示整行记录;默认情况下各域以空格或tab分隔开

FILENAME:awk浏览的文件名 ,注意大小写

FS:设置输入域分隔符,等价于命令行 -F选项

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

[root@justin ~]# awk -F: '{print "filename : " FILENAME,";""linenumber : " NR,";""Total number of columnsis :" NF,";""linename : " $0}' /etc/passwd
......
filename : /etc/passwd;linenumber : 32 ;Total number of columnsis :7 ;linename : abrt:x:173:173::/etc/abrt:/sbin/nologin
filename : /etc/passwd;linenumber : 33 ;Total number of columnsis :7 ;linename : sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
filename : /etc/passwd;linenumber : 34 ;Total number of columnsis :7 ;linename : tcpdump:x:72:72::/:/sbin/nologin
filename : /etc/passwd;linenumber : 35 ;Total number of columnsis :7 ;linename : justin:x:500:500:justin:/home/justin:/bin/bash

匹配操作符:

[root@justin ~]# awk "/root/" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@justin ~]# awk "/^root/" /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@justin ~]# awk -F : '/root/ {print $1}' /etc/passwd
root
operator
[root@justin ~]#

范围模版:

范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾

[root@justin ~]# touch /home/passwd
[root@justin ~]# tail -8 /etc/passwd > /home/passwd
[root@justin ~]# cat !$
cat /home/passwd
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/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
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
justin:x:500:500:justin:/home/justin:/bin/bash
[root@justin ~]# awk "/gdm/,/sshd/" /home/passwd
gdm:x:42:42::/var/lib/gdm:/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
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@justin ~]#

运算符:

= += -= *= /= %= ^= **=   赋值  

||                                           逻辑或  

&&                                        逻辑与  

~ ~!                                      匹配正则表达式和不匹配正则表达式;awk '$1 ~ /101/ {print $1}' file 显示文件中第一个域匹配101的行(记录)

< <= > >= != ==                 关系运算符  

空格                                       连接  

+ -                                        加,减  

* / &                                     乘,除与求余  

+ - !                                     一元加,减和逻辑非  

^ ***                                    求幂  

++ --                                   增加或减少,作为前缀或后缀  

$                                           字段引用 ,$NF表示最后一个域  

[root@justin ~]# awk -F: '/root/ && /bash/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@justin ~]# awk -F: '/root/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@justin ~]# awk -F: '$1=="tcpdump"' /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
[root@justin ~]# awk -F: '$3>499 || $4<1' /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
operator:x:11:0:operator:/root:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
justin:x:500:500:justin:/home/justin:/bin/bash
[root@justin ~]#


待完善......

你可能感兴趣的:(awk,RHEL6,服务器维护基础命令)