AWK知识小节

本文详细介绍了awk命令的使用,包括其基本语法、选项、模式、变量、函数及正则表达式的应用。通过实例展示了如何利用awk进行数据处理,如用户信息过滤、文件内容替换等,还涉及到了循环、条件判断和格式化输出等高级用法。
摘要由CSDN通过智能技术生成

                          

                         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/nologin
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 ~]#

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

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

[root@Test230 zy]# awk '/zhengzhoudaxue/{print NR-1}' test.txt 
5
12
[root@Test230 zy]# grep zhengzhoudaxue test.txt -B2 -c
2
[root@Test230 zy]# grep zhengzhoudaxue test.txt -B2 -n
4-eyrahrcfmrn
5-ewhjrnj
6:zhengzhoudaxue xixixix
--
11-test
12-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/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
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:4294967294:4294967294:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
avahi-autoipd:x:100:156:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
oracle:x:500:500::/home/oracle:/bin/bash
puppet:x:501:502::/home/puppet:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
zhuying:x:502:503::/home/zhuying:/bin/bash
[root@master ~]#

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

root
x
2
4
lp
/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/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 memory owner:/dev:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
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 account to be used by OProfile:/home/oprofile:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/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
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
wend
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值