AWK知识小节

来源:互联网 发布:淘宝大v是什么意思 编辑:程序博客网 时间:2024/06/16 02:19

                          

                         awk小节

1. awk的用法

 awk options “program” input_stream

更细点划分:awk options “pattern + Action”

awk将每个输入行识别成一条记录,而将那一行上的每个单词域识别成一个字段

********************************************

.$1,$2…$N表示输入的第几个记录

 $0表示输入的所有记录】

********************************************

2. Optons

-F fs制定一个分隔符

-f file制定读取的文件名

-v var=value定义一个变量,在gawk中有默认值

-mfN指定数据文件中处理的最大个数

-mrN指定数据文件中处理的最大size

-W keyword指定兼容模式或为gawk指定警告级别

3.Pattern

Regexp Patterns:使用正则表达式.

Expression Patterns:任何匹配的表达式

Ranges:指定匹配的范围

BEGIN/END:指定开始和结束规则

Empty:空记录,匹配任何记录

4.变量名   含义

ARGC命令行变元个数
ARGV
命令行变元数组,其中每一元素表示为ARGV[n],n为期望访问的命令行参数。
FILENAME
当前输入文件名

ENVIRON 支持系统设置的环境变量,例如ENVIRON[“EDITOR”] =“Vi”
FNR
当前文件中的记录号(可理解为行号),其变量值小于等于NR。
FS
输入域分隔符,默认为一个空格
RS
输入记录分隔符,缺省为新行(\n)
NF
当前记录里域个数(也可理解成当前的列数),在记录被读之后再设置
NR
到目前为止记录数(也就是当前的行数)
OFS
输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "
ORS
输出记录分隔符,缺省为新行(\n)

gsub(r,s) 在整个$0中用s替代r,r为原内容,s为新内容,r可为/正则/

gsub(r,s,t) 在整个t中用s替代r, r为原内容,s为新内容,r可为/正则/

index(s,t) 返回s中字符串t的第一位置

length(s) 返回s长度

match(s,r) 测试s是否包含匹配r的字符串

split(s,a,fs)以fs为分隔符将s分成序列数组a

sprint(fmt,exp) 返回经fmt格式化后的exp

sub(r,s) 将$0第一个r替换为s,r可为/正则/

sub(r,s,t) 将域t中的第一个r替换为s,r可为/正则/

substr(s,p) 返回字符串s中从p开始的后缀部分

substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

rand()  产生0到1之间的符点小数

Printf()
          -        左对齐
          width    域的步长,用0表示0步长
          . prec   最大字符串长度,或小数点右边的位数
          %c       ASCII字符
          %d       整数
          %e       浮点数,科学记数法
          %f       浮点数,例如(1 2 3 . 4 4)
          %g       awk决定使用哪种浮点数转换e或者f
          %o       八进制数
          %s       字符串
          %x       十六进制数

5.例子:

1.Pattern为表达式:

查找用户UID大于500的信息:

[root@station30 ~]# awk -F: '$3>500{print $0}' /etc/passwd

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologinvisitor:x:501:501::/home/visitor:/bin/bashzhuying:x:502:502::/home/zhuying:/bin/bashuser1:x:503:503::/home/user1:/bin/bashstu:x:504:504::/home/stu:/bin/bashNatasha:x:505:505::/home/Natasha:/bin/bashnatasha:x:2000:2000::/home/natasha:/bin/bashwendy:x:2001:2001::/home/wendy:/bin/bashcracker:x:2002:2002::/home/cracker:/sbin/nologin[root@station30 ~]#

查找root用户的信息:

[root@station30 ~]# awk -F: '$1=="root"{print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

[root@station30 ~]#

将第一字段都替换成root,相当于给变量赋值:(和上个例子进行比较)

[root@station30 ~]# awk -F: '$1="root"{print $0}' /etc/passwd

root x 0 0 root /root /bin/bashroot x 1 1 bin /bin /sbin/nologinroot x 2 2 daemon /sbin /sbin/nologinroot x 3 4 adm /var/adm /sbin/nologinroot x 4 7 lp /var/spool/lpd /sbin/nologinroot x 5 0 sync /sbin /bin/syncroot x 6 0 shutdown /sbin /sbin/shutdownroot x 7 0 halt /sbin /sbin/haltroot x 8 12 mail /var/spool/mail /sbin/nologinroot x 9 13 news /etc/newsroot x 10 14 uucp /var/spool/uucp /sbin/nologinroot x 11 0 operator /root /sbin/nologinroot x 12 100 games /usr/games /sbin/nologinroot x 13 30 gopher /var/gopher /sbin/nologinroot x 14 50 FTP User /var/ftp /sbin/nologinroot x 99 99 Nobody / /sbin/nologinroot x 69 69 virtual console memory owner /dev /sbin/nologinroot x 32 32 Portmapper RPC user / /sbin/nologinroot x 47 47 /var/spool/mqueue /sbin/nologinroot x 51 51 /var/spool/mqueue /sbin/nologinroot x 28 28 NSCD Daemon / /sbin/nologinroot x 16 16 Special user account to be used by OProfile /home/oprofile /sbin/nologinroot x 77 77 /var/arpwatch /sbin/nologinroot x 38 38 /etc/ntp /sbin/nologinroot x 81 81 System message bus / /sbin/nologinroot x 70 70 Avahi daemon / /sbin/nologinroot x 43 43 X Font Server /etc/X11/fs /sbin/nologinroot x 29 29 RPC Service User /var/lib/nfs /sbin/nologinroot x 65534 65534 Anonymous NFS User /var/lib/nfs /sbin/nologinroot x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologinroot x 68 68 HAL daemon / /sbin/nologinroot x 42 42 /var/gdm /sbin/nologinroot x 100 103 avahi-autoipd /var/lib/avahi-autoipd /sbin/nologinroot x 500 500 /home/student /bin/bashroot x 501 501 /home/visitor /bin/bashroot x 502 502 /home/zhuying /bin/bashroot x 503 503 /home/user1 /bin/bashroot x 504 504 /home/stu /bin/bashroot x 505 505 /home/Natasha /bin/bashroot x 2000 2000 /home/natasha /bin/bashroot x 2001 2001 /home/wendy /bin/bashroot x 2002 2002 /home/cracker /sbin/nologin

直接找某个字符串的前一行号:

[root@Test230 zy]# awk '/zhengzhoudaxue/{print NR-1}' test.txt 512[root@Test230 zy]# grep zhengzhoudaxue test.txt -B2 -c2[root@Test230 zy]# grep zhengzhoudaxue test.txt -B2 -n4-eyrahrcfmrn5-ewhjrnj6:zhengzhoudaxue xixixix--11-test12-huhuhuh huhu test just a test~13:zhengzhoudaxue This is a test~

下面再来看一下mysqlbinlog的用法:

[root@mysql1 mysql]# mysqlbinlog --start-datetime="2012-04-17 01-00-00" --stop-datetime="2012-04-17 01-30-00" mysql-bin.000248 |grep  -B 5 "user_dealer"|grep -B 5 "id=198492"

我们来看看NR和NF到底表示的是什么意思:

[root@master ~]# cat /etc/passwd

root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinnews:x:9:13:news:/etc/news:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinnscd:x:28:28:NSCD Daemon:/:/sbin/nologinvcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologinrpc:x:32:32:Portmapper RPC user:/:/sbin/nologinapache:x:48:48:Apache:/var/www:/sbin/nologinmailnull:x:47:47::/var/spool/mqueue:/sbin/nologinsmmsp:x:51:51::/var/spool/mqueue:/sbin/nologinoprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologinpcap:x:77:77::/var/arpwatch:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinavahi:x:70:70:Avahi daemon:/:/sbin/nologinrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologinnfsnobody:x:4294967294:4294967294:Anonymous NFS User:/var/lib/nfs:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinhaldaemon:x:68:68:HAL daemon:/:/sbin/nologinavahi-autoipd:x:100:156:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologinxfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologingdm:x:42:42::/var/gdm:/sbin/nologinsabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologinoracle:x:500:500::/home/oracle:/bin/bashpuppet:x:501:502::/home/puppet:/bin/bashmysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bashzhuying:x:502:503::/home/zhuying:/bin/bash[root@master ~]#

[root@master ~]# cat /etc/passwd | awk -F: '{print $NR}'

rootx24lp/sbin/sbin/shutdown        

我们可以看出输出的是第一行的第一列,第二行的第二列。。。。际是NR就是表示当前的行数,在第一行的时候相当于$1,第二行的时候相当于$2,以此类推!

上面只是为了帮助大家更好的理解NR,其实正确的用法是:

[root@master ~]# cat /etc/passwd | awk -F:'NR==1{print $0}'
root:x:0:0:root:/root:/bin/bash

[root@master ~]# cat /etc/passwd | awk -F: '{print $NF}'

/bin/bash/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/bin/sync/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/bin/bash/bin/bash/bin/bash/bin/bash 

2.)Pattern为模糊匹配:

查找/etc/passwd中包含有Rootroot的行

[root@station30 ~]# awk -F: '$1~/[Rr]oot/{print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

查找/etc/passwd中不包含Rootroot的行

[root@station30 ~]# awk -F: '$1!~/[Rr]oot/{print $0}' /etc/passwd

bin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinnews:x:9:13:news:/etc/news:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinvcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologinrpc:x:32:32:Portmapper RPC user:/:/sbin/nologinmailnull:x:47:47::/var/spool/mqueue:/sbin/nologinsmmsp:x:51:51::/var/spool/mqueue:/sbin/nologinnscd:x:28:28:NSCD Daemon:/:/sbin/nologinoprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologinpcap:x:77:77::/var/arpwatch:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinavahi:x:70:70:Avahi daemon:/:/sbin/nologinxfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologinrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinhaldaemon:x:68:68:HAL daemon:/:/sbin/nologingdm:x:42:42::/var/gdm:/sbin/nologinavahi-autoipd:x:100:103:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologinstudent:x:500:500::/home/student:/bin/bashvisitor:x:501:501::/home/visitor:/bin/bashzhuying:x:502:502::/home/zhuying:/bin/bashuser1:x:503:503::/home/user1:/bin/bashstu:x:504:504::/home/stu:/bin/bashNatasha:x:505:505::/home/Natasha:/bin/bashnatasha:x:2000:2000::/home/natasha:/bin/bashwendy:x:2001:2001::/home/wendy:/bin/bashcracker:x:2002:2002::/home/cracker:/sbin/nologin[root@station30 ~]#  

 假如我们想要查看磁盘空间使用率,如果大于80%,就打印列表信息,这个时候我们就可以使用这个用法:

df -h|awk '{if ($5~/8.%/ || $5~/9.%/ || $5~/100%/) print}'

用点号代表一个字符~

3.)PatternRange

查找用户从rootdaemon的信息:

[root@station30 ~]# awk -F: '/^root:/,/^daemon:/{print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin[root@station30 ~]#  

4.)PatternBEGINEND:(此时若不输入文件,可进行算术运算)

BEGIN为预处理,仅执行一次

[root@station30 ~]# awk 'BEGIN{print 2*3}'

6

rand()为随机函数:)

[root@station30 ~]# awk 'BEGIN{printrand()}'

0.237788

[root@station30 ~]#

 

默认等待用户输入内容

[root@station30 ~]# awk 'END{print 3+4}'

this is a test

c

[root@station30 ~]#

 

ctrl+D,执行结果:

[root@station30 ~]# awk 'END{print 3+4}'

7

[root@station30 ~]#

 

ctrl+C结束:

[root@station30 ~]# awk 'END{print 3+4}'

[root@station30 ~]#

 

5.)分割符:                

-F:作用是指定分割符为”:”(FS输入域分隔符,默认为一个空格),并显示用户名,用户信息,最后一行(即:shell

[root@station30 ~]# awk -F: '{print $1,$5,$NF}' /etc/passwd

root root /bin/bashbin bin /sbin/nologindaemon daemon /sbin/nologinadm adm /sbin/nologinlp lp /sbin/nologinsync sync /bin/syncshutdown shutdown /sbin/shutdownhalt halt /sbin/haltmail mail /sbin/nologinnews newsuucp uucp /sbin/nologinoperator operator /sbin/nologingames games /sbin/nologingopher gopher /sbin/nologinftp FTP User /sbin/nologinnobody Nobody /sbin/nologinvcsa virtual console memory owner /sbin/nologinrpc Portmapper RPC user /sbin/nologinmailnull /sbin/nologinsmmsp /sbin/nologinnscd NSCD Daemon /sbin/nologinoprofile Special user account to be used by OProfile /sbin/nologinpcap /sbin/nologinntp /sbin/nologindbus System message bus /sbin/nologinavahi Avahi daemon /sbin/nologinxfs X Font Server /sbin/nologinrpcuser RPC Service User /sbin/nologinnfsnobody Anonymous NFS User /sbin/nologinsshd Privilege-separated SSH /sbin/nologinhaldaemon HAL daemon /sbin/nologingdm /sbin/nologinavahi-autoipd avahi-autoipd /sbin/nologinstudent /bin/bashvisitor /bin/bashzhuying /bin/bashuser1 /bin/bashstu /bin/bashNatasha /bin/bashnatasha /bin/bashwendy /bin/bashcracker /sbin/nologin[root@station30 ~]#     

指定OFS输出域分隔符(和上个例子进行比较)

[root@station30 ~]# awk -F: -v OFS=: '{print $1,$5,$NF}' /etc/passwd

root:root:/bin/bashbin:bin:/sbin/nologindaemon:daemon:/sbin/nologinadm:adm:/sbin/nologinlp:lp:/sbin/nologinsync:sync:/bin/syncshutdown:shutdown:/sbin/shutdownhalt:halt:/sbin/haltmail:mail:/sbin/nologinnews:news:uucp:uucp:/sbin/nologinoperator:operator:/sbin/nologingames:games:/sbin/nologingopher:gopher:/sbin/nologinftp:FTP User:/sbin/nologinnobody:Nobody:/sbin/nologinvcsa:virtual console memory owner:/sbin/nologinrpc:Portmapper RPC user:/sbin/nologinmailnull::/sbin/nologinsmmsp::/sbin/nologinnscd:NSCD Daemon:/sbin/nologinoprofile:Special user account to be used by OProfile:/sbin/nologinpcap::/sbin/nologinntp::/sbin/nologindbus:System message bus:/sbin/nologinavahi:Avahi daemon:/sbin/nologinxfs:X Font Server:/sbin/nologinrpcuser:RPC Service User:/sbin/nologinnfsnobody:Anonymous NFS User:/sbin/nologinsshd:Privilege-separated SSH:/sbin/nologinhaldaemon:HAL daemon:/sbin/nologingdm::/sbin/nologinavahi-autoipd:avahi-autoipd:/sbin/nologinstudent::/bin/bashvisitor::/bin/bashzhuying::/bin/bashuser1::/bin/bashstu::/bin/bashNatasha::/bin/bashnatasha::/bin/bashwendy::/bin/bashcracker::/sbin/nologin[root@station30 ~]#

ORS指定输出记录分隔符(即行分割符),此处两个换行符,即两行中间有个空白行

[root@station30 ~]# awk 'BEGIN{OFS=":";ORS="/n/n"};{print $1,$2}' /etc/passwd

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: news:x:9:13:news:/etc/news:: uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin: operator:x:11:0:operator:/root:/sbin/nologin: games:x:12:100:games:/usr/games:/sbin/nologin: gopher:x:13:30:gopher:/var/gopher:/sbin/nologin: ftp:x:14:50:FTP:User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin: vcsa:x:69:69:virtual:console rpc:x:32:32:Portmapper:RPC mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin: smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin: nscd:x:28:28:NSCD:Daemon:/:/sbin/nologin oprofile:x:16:16:Special:user pcap:x:77:77::/var/arpwatch:/sbin/nologin: ntp:x:38:38::/etc/ntp:/sbin/nologin: dbus:x:81:81:System:message avahi:x:70:70:Avahi:daemon:/:/sbin/nologin xfs:x:43:43:X:Font rpcuser:x:29:29:RPC:Service nfsnobody:x:65534:65534:Anonymous:NFS sshd:x:74:74:Privilege-separated:SSH:/var/empty/sshd:/sbin/nologin haldaemon:x:68:68:HAL:daemon:/:/sbin/nologin gdm:x:42:42::/var/gdm:/sbin/nologin: avahi-autoipd:x:100:103:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin: student:x:500:500::/home/student:/bin/bash: visitor:x:501:501::/home/visitor:/bin/bash: zhuying:x:502:502::/home/zhuying:/bin/bash: user1:x:503:503::/home/user1:/bin/bash: stu:x:504:504::/home/stu:/bin/bash: Natasha:x:505:505::/home/Natasha:/bin/bash: natasha:x:2000:2000::/home/natasha:/bin/bash: wendy:x:2001:2001::/home/wendy:/bin/bash: cracker:x:2002:2002::/home/cracker:/sbin/nologin: [root@station30 ~]#     

          

BEGIN开头的,是在第一行前就指定输入,输出符

[root@station30 ~]# awk 'BEGIN{FS=":";OFS=":"} {print $1,$5,$NF}' /etc/passwd

root:root:/bin/bashbin:bin:/sbin/nologindaemon:daemon:/sbin/nologinadm:adm:/sbin/nologinlp:lp:/sbin/nologinsync:sync:/bin/syncshutdown:shutdown:/sbin/shutdownhalt:halt:/sbin/haltmail:mail:/sbin/nologinnews:news:uucp:uucp:/sbin/nologinoperator:operator:/sbin/nologingames:games:/sbin/nologingopher:gopher:/sbin/nologinftp:FTP User:/sbin/nologinnobody:Nobody:/sbin/nologinvcsa:virtual console memory owner:/sbin/nologinrpc:Portmapper RPC user:/sbin/nologinmailnull::/sbin/nologinsmmsp::/sbin/nologinnscd:NSCD Daemon:/sbin/nologinoprofile:Special user account to be used by OProfile:/sbin/nologinpcap::/sbin/nologinntp::/sbin/nologindbus:System message bus:/sbin/nologinavahi:Avahi daemon:/sbin/nologinxfs:X Font Server:/sbin/nologinrpcuser:RPC Service User:/sbin/nologinnfsnobody:Anonymous NFS User:/sbin/nologinsshd:Privilege-separated SSH:/sbin/nologinhaldaemon:HAL daemon:/sbin/nologingdm::/sbin/nologin avahi-autoipd:avahi-autoipd:/sbin/nologinstudent::/bin/bashvisitor::/bin/bashzhuying::/bin/bashuser1::/bin/bashstu::/bin/bashNatasha::/bin/bashnatasha::/bin/bashwendy::/bin/bashcracker::/sbin/nologin[root@station30 ~]# 


以空白行分割~

6.)有多个action时,需要用隔开:

[root@station30 ~]# awk -F: '{print "++++++++++++++++++++";print $1,$NF}' /etc/passwd

++++++++++++++++++++root /bin/bash++++++++++++++++++++bin /sbin/nologin++++++++++++++++++++daemon /sbin/nologin++++++++++++++++++++adm /sbin/nologin++++++++++++++++++++lp /sbin/nologin++++++++++++++++++++sync /bin/sync++++++++++++++++++++shutdown /sbin/shutdown++++++++++++++++++++halt /sbin/halt++++++++++++++++++++mail /sbin/nologin++++++++++++++++++++news++++++++++++++++++++uucp /sbin/nologin++++++++++++++++++++operator /sbin/nologin++++++++++++++++++++games /sbin/nologin++++++++++++++++++++gopher /sbin/nologin++++++++++++++++++++ftp /sbin/nologin++++++++++++++++++++nobody /sbin/nologin++++++++++++++++++++vcsa /sbin/nologin++++++++++++++++++++rpc /sbin/nologin++++++++++++++++++++mailnull /sbin/nologin++++++++++++++++++++smmsp /sbin/nologin++++++++++++++++++++nscd /sbin/nologin++++++++++++++++++++oprofile /sbin/nologin++++++++++++++++++++pcap /sbin/nologin++++++++++++++++++++ntp /sbin/nologin++++++++++++++++++++dbus /sbin/nologin++++++++++++++++++++avahi /sbin/nologin++++++++++++++++++++xfs /sbin/nologin++++++++++++++++++++rpcuser /sbin/nologin++++++++++++++++++++nfsnobody /sbin/nologin++++++++++++++++++++sshd /sbin/nologin++++++++++++++++++++haldaemon /sbin/nologin++++++++++++++++++++gdm /sbin/nologin++++++++++++++++++++avahi-autoipd /sbin/nologin++++++++++++++++++++student /bin/bash++++++++++++++++++++visitor /bin/bash++++++++++++++++++++zhuying /bin/bash++++++++++++++++++++user1 /bin/bash++++++++++++++++++++stu /bin/bash++++++++++++++++++++Natasha /bin/bash++++++++++++++++++++natasha /bin/bash++++++++++++++++++++wendy /bin/bash++++++++++++++++++++cracker /sbin/nologin[root@station30 ~]#

7.)打印变量的值

ARGC命令行变元个数变量个数
ARGV
命令行变元数组数组表示变量

[root@station30 ~]# awk 'BEGIN{ print ARGC,ARGV[1]}' /etc/fstab

2 /etc/fstab

[root@station30 ~]#

 

[root@station30 ~]# gawk 'BEGIN{ print ARGC,ARGV[2]}' /etc/fstab /etc/shadow

3 /etc/shadow

 

搜索以bin开头的行,取出第三个字段(即用户uid),用该值乘以6,再赋给变量test,并打印之。

[root@station30 ~]# awk -F: '/^bin/{test=$3*6;print test}' /etc/passwd

6

[root@station30 ~]#  

 

打印用户名,并输出FNR=”行号FNR为当前文件中的记录号)

[root@station30 ~]# awk 'BEGIN{FS=":"}{print $1,"FNR="FNR}' /etc/passwd

root FNR=1bin FNR=2daemon FNR=3adm FNR=4lp FNR=5sync FNR=6shutdown FNR=7halt FNR=8mail FNR=9news FNR=10uucp FNR=11operator FNR=12games FNR=13gopher FNR=14ftp FNR=15nobody FNR=16vcsa FNR=17rpc FNR=18mailnull FNR=19smmsp FNR=20nscd FNR=21oprofile FNR=22pcap FNR=23ntp FNR=24dbus FNR=25avahi FNR=26xfs FNR=27rpcuser FNR=28nfsnobody FNR=29sshd FNR=30haldaemon FNR=31gdm FNR=32avahi-autoipd FNR=33student FNR=34visitor FNR=35zhuying FNR=36user1 FNR=37stu FNR=38Natasha FNR=39natasha FNR=40wendy FNR=41cracker FNR=42[root@station30 ~]# 


awk调用系统变量必须用单引号,如果是双引号,则表示字符串

 

8.)getline函数

通过getline函数取得date的值,并打印之

[root@station30 ~]# awk 'BEGIN{"date"|getline da;print da}'

Mon Feb 22 23:25:22 CST 2010

[root@station30 ~]#

 

 

 

结束等待输入数据:

[root@station30 ~]# awk 'BEGIN{"date"|getline da;print da,NR} END{print da}'

Mon Feb 22 23:32:22 CST 2010 0

 

 

 

 

 

CTRL+C,执行结果:

[root@station30 ~]# awk 'BEGIN{"date"|getline da;print da,NR} END{print da}'

Mon Feb 22 23:36:54 CST 2010 0

 

[root@station30 ~]#  

 

 

 

 

CTRL+D,执行结果

[root@station30 ~]# awk 'BEGIN{"date"|getline da;print da,NR} END{print da}'

Mon Feb 22 23:32:22 CST 2010 0

Mon Feb 22 23:32:22 CST 2010

[root@station30 ~]#      

 

9.)循环语句if

我们知道执行df –lh时,有些内容会分行显示,可用if语句将分行显示的内容显示为一行

[root@station30 ~]# df -lh|awk '{if (NF<2) {ORS="";print $1} else {ORS="/n";print $0}}'

Filesystem           Size Used Avail Use% Mounted on/dev/mapper/vol0-root                     7.8G 6.8G 576M 93% //dev/mapper/vol0-home                     465M  11M 431M  3% /home/dev/sda1             99M  29M  66M 31% /boottmpfs                506M    0 506M  0% /dev/shm/root/boot.iso       8.9M 8.9M    0 100% /root/iso1[root@station30 ~]#             

若显示当前设备:

[root@station116 ~]#df -lh|awk '{if (NF<2){ORS="";print $1} else {ORS="/n";print $0}}' | awk '/^///{print $0}' >df

[root@station116 ~]# cat df/dev/mapper/vg01-root                     2.0G 680M 1.3G 36% //dev/mapper/vg01-home                     2.0G  34M 1.9G  2% /home/dev/mapper/vg01-tmp 1.9G  36M 1.8G  2% /tmp/dev/mapper/vg01-usr 9.7G 2.1G 7.2G 23% /usr/dev/sda1            114M  21M  88M 19% /boot/dev/md5             973M  18M 906M  2% /backup/dev/mapper/myvol-lvm1                     194M 9.6M 175M  6% /share/dev/hdc             8.9M 8.9M    0 100% /media/CDROM

[root@station116 ~]#sed -i 's@/dev/mapper//([[:alnum:]]*/)-/([[:alnum:]]*/)@/dev//2//1@' df

[root@station116 ~]# cat df/dev/root/vg01                     2.0G 680M 1.3G 36% //dev/home/vg01                     2.0G  34M 1.9G  2% /home/dev/tmp/vg01 1.9G  36M 1.8G  2% /tmp/dev/usr/vg01 9.7G 2.1G 7.2G 23% /usr/dev/sda1            114M  21M  88M 19% /boot/dev/md5             973M  18M 906M  2% /backup/dev/lvm1/myvol                     194M 9.6M 175M  6% /share/dev/hdc             8.9M 8.9M    0 100% /media/CDROM[root@station116 ~]#

10.)循环语句while

SUM=1+2+3…100.

[root@station30 ~]# awk 'BEGIN{I=1;SUM=0;while (I<=100) {SUM+=I;I++};print SUM}'

5050

[root@station30 ~]#   

 

11.)循环语句for

 

[root@station116 ~]#awk -F: '{for(I=1; I<=NF; I++) {if (I<NF){ORS=" "; print $I "/t"} else {ORS="/n"; print $I}}}' /etc/passwd

root    x      0      0      root   /root  /bin/bashbin     x      1      1      bin    /bin   /sbin/nologindaemon  x      2      2      daemon /sbin  /sbin/nologinadm     x      3      4      adm    /var/adm       /sbin/nologinlp      x      4      7      lp     /var/spool/lpd /sbin/nologinsync    x      5      0      sync   /sbin  /bin/syncshutdown        x      6      0      shutdown       /sbin  /sbin/shutdownhalt    x      7      0      halt   /sbin  /sbin/haltmail    x      8      12     mail   /var/spool/mail        /sbin/nologinnews    x      9      13     news   /etc/news      uucp    x      10     14     uucp   /var/spool/uucp        /sbin/nologinoperator        x      11     0      operator       /root  /sbin/nologingames   x      12     100    games  /usr/games     /sbin/nologingopher  x      13     30     gopher /var/gopher    /sbin/nologinftp     x      14     50     FTP User       /var/ftp       /sbin/nologinnobody  x      99     99     Nobody /      /sbin/nologinvcsa    x      69     69     virtual console memory owner   /dev   /sbin/nologinrpc     x      32     32     Portmapper RPC user    /      /sbin/nologinmailnull        x      47     47             /var/spool/mqueue      /sbin/nologinsmmsp   x      51     51             /var/spool/mqueue      /sbin/nologinnscd    x      28     28     NSCD Daemon    /      /sbin/nologinoprofile        x      16     16     Special user account to be used by OProfile    /home/oprofile /sbin/nologinpcap    x      77     77             /var/arpwatch  /sbin/nologinntp     x      38     38             /etc/ntp       /sbin/nologindbus    x      81     81     System message bus     /      /sbin/nologinavahi   x      70     70     Avahi daemon   /      /sbin/nologinxfs     x      43     43     X Font Server  /etc/X11/fs    /sbin/nologinrpcuser x      29     29     RPC Service User       /var/lib/nfs   /sbin/nologinnfsnobody       x      65534  65534  Anonymous NFS User     /var/lib/nfs  /sbin/nologinsshd    x      74     74     Privilege-separated SSH        /var/empty/sshd /sbin/nologinhaldaemon       x      68     68     HAL daemon     /      /sbin/nologingdm     x      42     42             /var/gdm       /sbin/nologinavahi-autoipd   x      100    103    avahi-autoipd  /var/lib/avahi-autoipd /sbin/nologinzhuying x      500    500            /home/zhuying  /bin/bashnatasha x      2000   2000           /home/natasha  /bin/bashwendy   x      2001   2001           /home/wendy    /bin/bashcracker x      2002   2002           /home/cracker  /sbin/nologindovecot x      97     97     dovecot        /usr/libexec/dovecot   /sbin/nologin[root@station116 ~]#


12.)格式化输出

控制字符

cASCII字符显示

d以整数显示

id用法相同

e以科学计数法显示(默认小数位为6

f以浮点数显示

g以科学计数或者浮点数显示,哪个更短用哪个显示

o以八进制形式显示

s以字符形式显示

x以十六进制形式显示

X以十六进制形式显示,但用从AF的大写字母

***************************************************

*%后的控制字段:width(输入的最小宽度) .prce (精度)  -(minus,表示左对齐)

***************************************************

多个字段,(注意:没有指定输出控制字符)

[root@station30 ~]# awk -F : '{printf "%-20s %20s /n",$1,$NF}' /etc/passwd

root                           /bin/bashbin                        /sbin/nologindaemon                     /sbin/nologinadm                        /sbin/nologinlp                         /sbin/nologinsync                           /bin/syncshutdown                  /sbin/shutdownhalt                          /sbin/haltmail                       /sbin/nologinnewsuucp                       /sbin/nologinoperator                   /sbin/nologingames                      /sbin/nologingopher                     /sbin/nologinftp                        /sbin/nologinnobody                     /sbin/nologinvcsa                       /sbin/nologinrpc                        /sbin/nologinmailnull                   /sbin/nologinsmmsp                      /sbin/nologinnscd                       /sbin/nologinoprofile                   /sbin/nologinpcap                       /sbin/nologinntp                        /sbin/nologindbus                       /sbin/nologinavahi                      /sbin/nologinxfs                        /sbin/nologinrpcuser                    /sbin/nologinnfsnobody                  /sbin/nologinsshd                       /sbin/nologinhaldaemon                  /sbin/nologingdm                        /sbin/nologinavahi-autoipd              /sbin/nologinstudent                        /bin/bashvisitor                        /bin/bashzhuying                        /bin/bashuser1                          /bin/bashstu                            /bin/bashNatasha                        /bin/bashnatasha                        /bin/bashwendy                          /bin/bashcracker                    /sbin/nologin[root@station30 ~]#          

科学计数法

[root@station30 ~]#awk 'BEGIN{printf "%e/n",232.434345}'

2.324343e+02

[root@station30 ~]# 

 

 

浮点数

[root@station30 ~]#awk 'BEGIN{printf "%8.2f",265.4363333}'

 265.44[root@station30 ~]#   

 

 

 

     

若在最后加入文件,则显示结果为:

[root@station30 ~]#awk 'BEGIN{"date"|getline da;print da,NR} END{print da}' /etc/fstab

Mon Feb 22 23:40:24 CST 2010 0

Mon Feb 22 23:40:24 CST 2010

[root@station30 ~]# 

 

[root@station30 ~]#awk -F: 'BEGIN { max=100 ;print "max=" max} {max=($1 >max ?$1:max); print $1,"Now max is "max}' /etc/passwd

max=100root Now max is rootbin Now max is rootdaemon Now max is rootadm Now max is rootlp Now max is rootsync Now max is syncshutdown Now max is synchalt Now max is syncmail Now max is syncnews Now max is syncuucp Now max is uucpoperator Now max is uucpgames Now max is uucpgopher Now max is uucpftp Now max is uucpnobody Now max is uucpvcsa Now max is vcsarpc Now max is vcsamailnull Now max is vcsasmmsp Now max is vcsanscd Now max is vcsaoprofile Now max is vcsapcap Now max is vcsantp Now max is vcsadbus Now max is vcsaavahi Now max is vcsaxfs Now max is xfsrpcuser Now max is xfsnfsnobody Now max is xfssshd Now max is xfshaldaemon Now max is xfsgdm Now max is xfsavahi-autoipd Now max is xfsstudent Now max is xfsvisitor Now max is xfszhuying Now max is zhuyinguser1 Now max is zhuyingstu Now max is zhuyingNatasha Now max is zhuyingnatasha Now max is zhuyingwendy Now max is zhuyingcracker Now max is zhuying[root@station30 ~]#     

(表达式1?表达式2:表达式3相当于:
    if (
表达式
1)
       
表达式
2
    else
       
表达式
3

13) 正则表达式

ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4 "/" $NF}'中"[ :]+" 是什么意思?

[ :]+这个是正则表达式,+表示一个或多个,这里就表示一个或多个空格或冒号

[root@master ~]# ifconfig eth0eth0      Link encap:Ethernet  HWaddr 00:50:56:AA:09:63            inet addr:192.168.55.229  Bcast:192.168.55.255  Mask:255.255.255.0          inet6 addr: fe80::250:56ff:feaa:963/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:12941576 errors:0 dropped:0 overruns:0 frame:0          TX packets:4634338 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:2163271655 (2.0 GiB)  TX bytes:2054009869 (1.9 GiB)

[root@master ~]# ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4 "/" $NF}'
192.168.55.229/255.255.255.0
[root@master ~]#

ps:

1。内建变量FS保存输入域分隔符的值,默认空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。

2。可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。

下面我们来举个例子:

[root@master ~]# echo "inet addr:192.168.55.229  Bcast:192.168.55.255  Mask:255.255.255.0"|awk -F"[ : ]" '{print $3}'
192.168.55.229
[root@master ~]#

[root@master ~]# echo "inet addr:192.168.55.229  Bcast:192.168.55.255  Mask:255.255.255.0"|awk -F"[ : ]" '{print $2}'
addr
[root@master ~]#

14)-v的作用:定义变量

ls -l *log|awk -v PERMIT_LOG_SIZE=1610598912 '{if($5>=PERMIT_LOG_SIZE) print $9}'【正确】

ls -l *log|awk -v PERMIT_LOG_SIZE=1610598912 '{if($5>=$PERMIT_LOG_SIZE) print $9}'【错误】

注意一定不要加上那个$,加上之后就相当于没有判断了,你自己可以试试的~

另外需要说明的是这条命令的作用:所有以log结尾的日志中大于1.5G的~

例子:假如在一个循环中,我们输出结果时候,想带上ip,那么我们就可以用以下方法:

[oracle@sor-sys~]$ i=172.16.30.139

[oracle@sor-sys~]$uptime |cut -d, -f6|awk -v ip=$i '{if ($1+0>=0) print "========load!!" , ip ,$1 "==========="}'
========load!! 172.16.30.139 0.00===========

看看,输出结果了吧,O(∩_∩)O哈哈~

15)运算法

一个最简单的运算方法,判断这个字段是否大于某个值,同时可以避免带字母的字段输出【ASSIC见的转换~】

[oracle@sor-sys ~]$ echo xxx | awk '{if ($1>1)print $1}'
xxx
[oracle@sor-sys ~]$ echo xxx | awk '{if ($1+0>1)print $1}'
[oracle@sor-sys ~]$ 

清楚了吧?下面再来看几个例子~

(A).时间类的,带有冒号~

[oracle@sor-sys ~]$ cat top.txt|awk '{if ($6+0>1.8) print $0}'
11197 oracle    16   0   46   1005:39  8.9 2132m 1.4g  24m S java
15257 oracle    16   0   14  76:57.47  7.9 1579m 1.2g  22m S java
15927 oracle    16   0    4  46:57.91  9.1 2239m 1.4g  49m S java
 3355 oracle    17   0    2 101:52.18  7.3 1384m 1.1g  17m S java
 3356 oracle    16   0    0 216:13.44  7.6 2446m 1.2g  37m S java
 5425 oracle    17   0    0 181:26.75  7.7 1489m 1.2g  18m S java
18499 oracle    16   0    0  11:07.68 11.0 2755m 1.7g  70m S java
[oracle@sor-sys ~]$ cat top.txt|awk '{if ($6>1.8) print $0}'
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
11197 oracle    16   0   46   1005:39  8.9 2132m 1.4g  24m S java
15257 oracle    16   0   14  76:57.47  7.9 1579m 1.2g  22m S java
15927 oracle    16   0    4  46:57.91  9.1 2239m 1.4g  49m S java
 3355 oracle    17   0    2 101:52.18  7.3 1384m 1.1g  17m S java
 3356 oracle    16   0    0 216:13.44  7.6 2446m 1.2g  37m S java
 5425 oracle    17   0    0 181:26.75  7.7 1489m 1.2g  18m S java
18499 oracle    16   0    0  11:07.68 11.0 2755m 1.7g  70m S java

发现了木有,加不加0结果是不一样的哦,就像浅黄色的那一行输出,正是将字母转换成ASICC,进行输出的~

[oracle@sor-sys ~]$ cat top.txt |awk '{ if ($6+0>1.8)print "--------------------------------" $1,$2,$3,$5,int($6),$7,$11,$12"----------------------"  }'
--------------------------------11197 oracle 16 461005 8.9 S java----------------------
--------------------------------15257 oracle 16 1476 7.9 S java----------------------
--------------------------------15927 oracle 16 446 9.1 S java----------------------
--------------------------------3355 oracle 17 2101 7.3 S java----------------------
--------------------------------3356 oracle 16 0216 7.6 S java----------------------
--------------------------------5425 oracle 17 0181 7.7 S java----------------------
--------------------------------18499 oracle 16 011 11.0 S java----------------------
[oracle@sor-sys ~]$ cat top.txt |awk '{ if ((int($6)>18))print "--------------------------------" $1,$2,$3,$5,int($6),$7,$11,$12"----------------------"  }'
--------------------------------11197 oracle 16 461005 8.9 S java----------------------
--------------------------------15257 oracle 16 14 76 7.9 S java----------------------
--------------------------------15927 oracle 16 4 46 9.1 S java----------------------
--------------------------------3355 oracle 17 2 101 7.3 S java----------------------
--------------------------------3356 oracle 16 0 216 7.6 S java----------------------
--------------------------------5425 oracle 17 0 181 7.7 S java----------------------

(B).带有单位的数字

[oracle@sor-sys ~]$cat top.txt 
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 


11197 oracle    16   0   46   1005:39  8.9 2132m 1.4g  24m S java
15257 oracle    16   0   14  76:57.47  7.9 1579m 1.2g  22m S java
15927 oracle    16   0    4  46:57.91  9.1 2239m 1.4g  49m S java
 3355 oracle    17   0    2 101:52.18  7.3 1384m 1.1g  17m S java
 3356 oracle    16   0    0 216:13.44  7.6 2446m 1.2g  37m S java
 5425 oracle    17   0    0 181:26.75  7.7 1489m 1.2g  18m S java
18499 oracle    16   0    0  11:07.68 11.0 2755m 1.7g  70m S java

[oracle@sor-sys ~]$ cat top.txt |grep 'g '|awk '{if ($8>2000) print "---------" $8 "--------"}'
---------2132m--------
---------2239m--------
---------2446m--------
---------2755m--------

[oracle@sor-sys ~]$ cat top.txt |grep 'g '|awk '{if ($8+0>2000) print "---------"int($8)"--------"}'
---------2132--------
---------2239--------
---------2446--------
---------2755--------

再举个最常用的例子,就是判断磁盘的使用率是否大于80%,大于就输出~

[oracle@sor-sys properties]$ df -hP|awk '{if ($5>80) print}'
Filesystem            Size  Used Avail Use% Mounted on
//192.168.63.150/online  246G  192G   41G  83% /tmp/t
[oracle@sor-sys properties]$ df -hP|awk '{if ($5+0>80) print}'
//192.168.63.150/online  246G  192G   41G  83% /tmp/t

(16)for循环

命令做统计的:
netstat -n | awk '/^tcp/ {++S[$NF]}END {for(a in S) print a,S[a]}'
[root@Test230 ~]# netstat -n|grep "^tcp"
tcp 0 0 127.0.0.1:6102 127.0.0.1:15913 ESTABLISHED 
tcp 0 0 192.168.55.230:8890 192.168.55.230:50290 TIME_WAIT 
tcp 0 0 192.168.55.230:8890 192.168.55.230:50291 TIME_WAIT 
tcp 0 0 192.168.55.230:8890 192.168.55.230:50292 TIME_WAIT 
tcp 0 0 127.0.0.1:15913 127.0.0.1:6102 ESTABLISHED 
tcp 0 0 192.168.55.230:6202 192.168.55.229:6746 ESTABLISHED 
tcp 0 0 192.168.55.230:44772 192.168.55.231:6202 ESTABLISHED 
tcp 0 52 ::ffff:192.168.55.230:22 ::ffff:192.168.169.44:1215 ESTABLISHED 
[root@Test230 ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 3
ESTABLISHED 5
小节:

++state[$NF]
表示把某个数加一,如上所示:就是把state[TIME_WAIT]状态的连接数加一

(17)两个文件合并

1.txt58.82.0.0/15   58.82.0.0/1658.87.64.0/18 58.87.64.0/2458.99.128.0/17 58.99.128.0/2459.107.0.0/16 59.107.0.0/1759.108.0.0/15 59.108.0.0/1659.172.0.0/14 59.172.0.0/1559.191.0.0/16 59.191.0.0/17
2.txt58.82.0.0/16          ctc            58.87.64.0/24         cnc         58.99.128.0/24        ctc      59.107.0.0/17         cnc   59.108.0.0/16         ctc   59.172.0.0/15         ctc     59.191.0.0/17         ctc   
现在想实现的是如果1.txt 的第二个字段和2.txt的第一个字段相同的话,用1.txt的第一个字段替换2.txt的第一个字段。

得到的结果:

58.82.0.0/15   ctc
58.87.64.0/18  cnc
58.99.128.0/17 ctc
59.107.0.0/16  cnc
59.108.0.0/15  ctc
59.172.0.0/14  ctc
59.191.0.0/16  ctc
方法(一):

awk 'NR==FNR{a[$1]=$2}NR>FNR{print $1,a[$2]}' 2.txt 1.txt

awk 'NR==FNR{a[$2]=$1}NR>FNR{if (a[$1] != "") {print a[$1],$2} else {print $1,$2}}' 1.txt 2.txt 【这个是加了个判断~】

方法(二):

 join -1 2 -2 1 -o 1.1 2.2 1.txt 2.txt 
(18)例子:
[root@sor-sys zy]# cat cat.sh 
11
22
12
23
34
如何将上面打印出来的结果相加,求和~
方法一:
[root@sor-sys zy]# awk '{sum+=$1}{print sum}' cat.sh 
11
33
45
68
102
【正确的写法:cat cat.sh | awk '{sum+=$1} END {print sum}'】直接打印出结果来~
还可以这样写:
[root@sor-sys zy]# awk 'BEGIN{sum=0}{sum+=$1}END{print sum}' cat.sh 
102
方法二:
[root@sor-sys zy]# cat cat.sh | awk '{sum+=$1} END {print sum}'
102
这种方法因为有cat,会将内容读入内存,内容多的话会影响性能~
方法三:
脚本循环:
#!/bin/bash
FileName=$1
declare -i sum=0
dir=`pwd`
for i in `cat ${dir}/$FileName `;do
sum=`expr $i + $sum`
done

echo $sum
以上三种方法仅供参考~

(18)案例汇总:
list.txt的文件内容:
54786542:13744232156     360565687:15026736523    360565687:13597572727    100000:13898754555       100000:13898754555       1510121:155554215544:TTTabaoping 207     1986 2009       1986 2007       baoping 2007    Malist          dj121M112d12nmm tete            
awk '/^/' list.txt      匹配包含^的行,即显示全文 
awk '/$/' list.txt      匹配包含$的行,即显示全文                                                       
awk '/./' list.txt      匹配包含^的行,即显示全文                                          
awk '/.*/' list.txt     匹配包含任意字符的行,即显示全文
awk '/M/' list.txt    显示包含字符M所有的行
awk '/M/ { print $1 }' list.txt   显示包含M的行的第一串字符串
awk '/M/ {print "TT",$1}' list.txt   匹配包含M前面添加显示TT空格
awk -F, '{ print $1; print $2}' list.txt  逗号为分隔符,无第二串则换行【IMP】
==>awk '{print NF}' list.txt 显示默认分隔符最后一个分段$数置【IMP】
==>awk '{print $NF}' list.txt    显示最后一分段的值
awk '{n++}END{print n" line"}' list.txt 统计文本内容行数【IMP】
==》awk -F: '{if($2~/15026736523/) print $0}' list.txt 匹配第二域,并显示该记录
==》awk -F: '$2~/15026736523/{print $0}' list.txt匹配第二域,并显示该记录
==>awk '$0~/15026736523/{print $0}' list.txt匹配手机号,并显示该记录
==>awk '$0!~/15026736523/' list.txt   不匹配并显示该记录【IMP】
==》awk -F: '$2==15026736523{print $0}' list.txt 精确匹配$2的值
==》awk -F: '{if($2==15026736523)print $0}' list.txt精确匹配$2的值
awk -F: '{if($1 < $2) print $0}' list.txt   判断$1小于$2的记录并print
awk '/[Mm].*/' list.txt    匹配M.*或者m.*【其实出来的结果也可以是*.m或*.M】
awk -F: '$1 ~/^...i/ {print $0}' list.txt 匹配第四个字符为i的行并显示【IMP】
awk -F: '$1 ~ /(360|332)/ {print $0}' list.txt 匹配360和332的行.效果同[ ]【IMP】
==》awk -F: '$1==360565687 && $2==15026736523{print $0}' list.txt 同时要符合条件,交集 【其中{print $0}可以可无
==》awk -F: '{if ($1~/360/ || $2 ~/150/)print $0}' list.txt 匹配任何一个,并集【IMP】
awk '{if (NR>0 && $1~/3605656/)print $0}' list.txt 匹配if条件【IMP】
awk 'BEGIN{var="200"} {if ($1<var) print $0}' list.txt 利用begin赋值【歧义】
==>awk '{if($1=="baoping"){$2=$2+1;print $2}}' list.txt 算术运算【计算第一个域是baoping,且第二个域不为空的时候,将第二个域的值加一】
==>awk '{if($1=="baoping"){$2=$2+1};print $2}' list.txt算术运算【只要有第二个域的,将第二个域的值加一】
==》awk '{if($1=="baoping") $2="1986";print $2}' list.txt 重新赋值并显示所有$2                                                                 
==》awk '{if($1=="baoping") {$2="1986";print $2}}' list.txt 重新赋值并显示单个$2 
awk 'BEGIN{print "To"}{if($1<$2) {$2=$2-$1;print $0}}' list.txt结果显示To \n $2 $(($2-$1))
awk '{(tot+=$2)}; END{print "total number:" tot}' list.txt 计算所有$2列的和【IMP】
ls -l | awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END {print "KB:" tot}' 大小和【前面的文件和大小都列出来,最后添加一项汇总】【IMP】
awk 'gsub("2007","2009",$0){print $0}' list.txt   将2007改为2009并显示
awk 'BEGIN {print index("150","5")}'    显示2,数所在的位数
awk '$1=="baoping" {print length($1)" "$1}' list.txt 显示结果7 baoping,字符长度
awk '$1=="baoping" {print match($2,"7")}' list.txt 相同字符首位置
awk 'BEGIN {print split("1#2#3#4",shuzu,"#")}' 结果为数组有4个元素shuzu[]
echo az bg cde|awk '{sub(/[ab]/,"g",$2);print $2}' sub用正则表达式替换,结果gg
awk -F"[ :]" '{ print $1 }' list.txt   同时使用两个分隔符
awk '$1=="1986" {print substr($2,1,3)}' list.txt   显示匹配的$2从1后3个字符
awk '{print substr($1,3)}' list.txt   显示每行第3字符后的字符
==>awk 'BEGIN{STR="hello"}END{print substr(STR,4)}' list.txt 从第四位开始即lo
==>echo "Stand-by" | awk '{print length($0)}' 统计变量字符个数 
STR="mydoc.txt"; echo $STR|awk '{print substr($STR,1,5)}' 结果mydoc【IMP】
==》echo "65" | awk '{printf "%c\n",$0}' 以ASCII码显示65即A
==》awk 'BEGIN{printf "%c\n",65}' 以ASCII码显示65
awk 'BEGIN{printf "%f\n",999}'   以符点数显示结果999.000000
awk -F"[: ]" '{printf "%-15s %s\n",$1,$2}' list.txt $1与$2分别1 5个字符长度【IMP】
==》awk '{if ($1<QQ) print $0}' QQ=360565687 list.txt   传递参数给awk使用
==》awk 'BEGIN{QQ=360565687}{if ($1<QQ) print $0}' list.txt   传递参数给awk使用
==》awk -v QQ=360565687 '{if ($1<QQ) print $0}' list.txt 传递参数给awk使用
--》awk 'BEGIN{FS=":"}{print $1,"\t",$2}' list.txt   此方式必须在begin指定分隔符
--》awk -F: '{print $1"\t"$2}' list.txt 【以上两种方法均可~】
awk 'NF!=MAX{print("line "NR" does not "MAX"")}' MAX=2 list.txt 如域数不等于2则显示,C风格【IMP】
awk 'BEGIN{print (1+2.5)*3}'    结果10.5,shell不能比较浮点数
awk 'BEGIN {split("123#456#789",my,"#");print my[1]}'   此时my[1]为第一个元素123

1008520650 天津 http://www.aibang.com/abc/a.jpg 0.0151008522118 天津 http://www.aibang.com/abc/a.jpg 0.0151008520646 天津 http://www.aibang.com/abc/a.jpg 0.0151999853994 沈阳 http://www.aibang.com/abc/a.jpg 0.0151008520650 天津 http://www.aibang.com/abc/a.jpg 0.0151008522118 天津 http://adad.ada.con/da 0.018         1008520646 天津 http://adadad/dad/dd.abc 0.016       1999853994 沈阳 http://www.sohu.com/abc/d.jif 1.14   
awk '/aaa/ {sum += $2};END {print sum}' test第一列为aaa的行求和
awk '/天津/{sum += $NF};END {print sum}' lastlog
awk -F: '{a[$1]=a[$1]"\n"$2;v[$1]++}END{for ( i in a )print "["i"]",v[i],a[i]}' qq.txt
awk '{for(i=1;i<100;i++){if($i ~/UN=/){print $2"\t"substr($5,2)" "$8" "$i}}}' kkk.txt //使用标准风格的for语句
awk 'a=0;{for(i=1;i<=NF;i++)a+=$i;b=a/NF;print b}' 1.txt //求1.txt每行的平均值
awk '{for(i=1;i<=NF;i++)a[i]+=$i}{if(NR==3){for(i=1;i<=NF;i++){print a[i]/NR}}}' 1.txt //求前行平均每列的平均值

关于双色球小节:
查看近几期每期的平均数
[oracle@sor-sys zy]$ cat shuangse.sh 
57:03 05 19 21 27 31 04
58:03 06 15 20 25 26 04
59:04 13 21 22 26 31 01

60:07 10 13 16 17 29 01
61:03 08 11 12 14 18 14
62:02 13 16 17 20 31 07
63:02 10 17 19 24 27 12
64:5  10 11 16 23 24 11
65:8  10 18 19 27 31 14
66:1  2  9  26 29 33 12
67:4  5  10 21 26 30 16
57-59期的每列的平均值:
[oracle@sor-sys zy]$ cat shuangse.sh |cut -d: -f2|awk 'BEGIN{ORS="\t"}{for(i=1;i<=NF;i++)a[i]+=$i}{if(NR==3){for(i=1;i<=NF;i++){print a[i]/NR}}}' 
3.33333 8       18.3333 21      26      29.3333 3       [oracle@sor-sys zy]$ 
[oracle@sor-sys zy]$ 
每期的总和和平均数:
[oracle@sor-sys zy]$ cat shuangse.sh |cut -d: -f2|awk 'sum=0;{for (i=1;i<=NF;i++)sum+=$i;b=sum/NF;print b}'
15.7143
14.1429
16.8571
13.2857
11.4286
15.1429
15.8571
14.2857
18.1429
16
16
cut -d: -f2 shuangse.sh|awk '{sum=0;for (i=1;i<=NF;i++)sum+=$i;print sum}'
cat shuangse.sh |cut -d: -f2|awk 'sum=0;{for (i=1;i<=NF;i++) sum+=$i;b=sum/NF;print b}'加颜色的部分千万不要多加;或者少加;
延伸:
[oracle@sor-sys zy]$ 
[oracle@sor-sys zy]$ cat shuangse.sh |cut -d: -f2|awk '{print $0}{sum=0;for (i=1;i<=NF;i++)sum+=$i;b=sum/NF;print "The total of above:"sum,"The avage of above:"b}'
03 05 19 21 27 31 04
The total of above:110 The avage of above:15.7143
03 06 15 20 25 26 04
The total of above:99 The avage of above:14.1429
04 13 21 22 26 31 01
The total of above:118 The avage of above:16.8571
07 10 13 16 17 29 01
The total of above:93 The avage of above:13.2857
03 08 11 12 14 18 14
The total of above:80 The avage of above:11.4286
02 13 16 17 20 31 07
The total of above:106 The avage of above:15.1429
02 10 17 19 24 27 12
The total of above:111 The avage of above:15.8571
5  10 11 16 23 24 11
The total of above:100 The avage of above:14.2857
8  10 18 19 27 31 14
The total of above:127 The avage of above:18.1429
1  2  9  26 29 33 12
The total of above:112 The avage of above:16
4  5  10 21 26 30 16
The total of above:112 The avage of above:16
[oracle@sor-sys zy]$ 



假如想偷懒一下,输出2-6个域,不想一个个的输出,那么可以用以下方法:
[oracle@Test232 zy]$ awk 'BEGIN{ORS=" "}{for (i=2;i<=6;i++)print $i}' awk.log 
2 3 4 5 6 [oracle@Test232 zy]$ 
[oracle@Test232 zy]$ 
注意:
命令行下,我们木有办法更改最后的换行,但是如果我们放到脚本中执行,可以添加一个echo,然后结果会大有不同哦,吼吼~
awk 'BEGIN{ORS=" "}{for (i=2;i<=6;i++)print $i}'  file
echo
[oracle@Test232 zy]$ sh awk.sh 
2 3 4 5 6 
[oracle@Test232 zy]$ 

示例:
echo intra   172.16.30.138   /opt/oracle/product/10.1.3.1/OracleAS/j2ee/INTRA_OC4J/applications/ true app-intra-stage2.ear|awk 'BEGIN{ORS=" "}{for (i=2;i<=6;i++)print $i}'