linux awk命令统计模式扫描和处理语言详解

作者: admin 分类: linux常用命令大全 发布时间: 2018-06-30 14:41

  awk模式扫描和处理语言

  功能描述:

  使用awk命令可以行读入文件,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk是一个强大的文本分析工具,相对于grep查找、sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。

  命令语法:

  awk[选项][文件]

  awk[选项][程序][文件]

  awk命令选项含义

 

 选项

 含义

 -f<程序文件>  从指定程序文件读取AWK程序源
 -F<文件系统>  使用指定文件系统为输入字段分隔符
 -v<变量=值>  开始执行程序之前为变量值
 -mf<值>  设置不同的内存限制值。f标志设置字段的最大数目
 -mr<值>  设置不同的内存限制值。r标志设置最大记录大小
 -O  在程序的内部表示启用优化
 --compat  运行在兼容模式下
 --dump-variables=<文本>  显示全局变量、其类型值和最终值到文件的排序列表
 --exec=<文本>  类似于-f选项,但这是选项的最后一个处理
 --gen-po  扫描和解析AWK程序,并在标准输出上生成一个GNU.po格式文件
 --non-decimal-data  在输入数据中识别八进制和十六进制值
 --profile=<文本>  发送分析数据文件。默认值是awkprof.out
 --re-interval  启用正则表达式匹配使用间隔表达式
 --source=<程序文本>  使用指定程序文本作为AWK程序的源代码
 --traditional  匹配传统的UNIX awk正则表达式
 --usage  显示在标准输出上可用的选项相对简短摘要
 --use-lc-numeric  当解析输入数据时强制使用语言环境的小数点字符

 

 

内置变量

 

 内置变量

描述 

 ARGC 命令行参数个数 
 ARGV  命令行参数排列
 ENVIRON  包含当前环境的值的数组
 FILENAME  当前输入文件的名称
 FNR  当前输入文件的输入记录数
 FS  输入字段分隔符,默认情况下为一个空格
 NF  在当前输入记录中的字段的数目
 NR  已读的记录数
 OFS  输出字段分隔符
 ORS  输出记录分隔符
 RS  输入记录分隔符,默认情况下为一个换行符
 OFMT  用于数字的输出格式
 RT  记录终止符
 RSTART  匹配第一个字符的索引
 RLENGTH  匹配字符串长度
 SUBSEP  字符用于分隔多个标在数组中的元素,默认情况下是“\034”
 TEXTDOMAIN  awk程序的文本域
 ARGIND  当前文件的ARGV索引正在处理中
 BINMODE  在排POSIX系统上,指定使用“二进制”模式下所有的文件I/O
 CONVFMT  用于数字的转换格式,默认情况下是“%.6g”
 IGNORECASE  控制所有的正则表达式和字符串操作区分大小写
 PROCINFO  提供数组的元素访问运行AWK程序有关信息

 

 

字符串常量

 

 字符串常量

 描述

 \\  反斜线
 \a  alert字符,通常为ASCII BEL字符
 \b  退格键
 \f  换页
 \n  换行符
 \r  回车
 \t  水平制表符
 \v  垂直制表符
 \xhex digits  字符由十六进制数字下面的\x中的字符串来表示
 \c  字面字符c

 

 

例如:只显示最近登录系统的5个用户

[root@localhost ~]# last -n 5 | awk '{print $1}'
root
root
root
reboot
root

wtmp

只显示/etc/passwd文件中的账户

[root@localhost ~]# cat /etc/passwd | awk -F: '{ print $1 }'
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
dbus
usbmuxd
rpc
oprofile
vcsa
rtkit
abrt
hsqldb
avahi-autoipd
saslauth
postfix
apache
rpcuser
nfsnobody
haldaemon
gdm
ntp
pulse
tomcat
sshd
tcpdump
mysql

只显示/etc/passwd文件中的账户和账户对应的shell,账户与shell之间以[Tab]键分隔

[root@localhost ~]# cat /etc/passwd | awk -F: '{ print $1"\t"$7 }'
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
uucp /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
gopher /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
dbus /sbin/nologin
usbmuxd /sbin/nologin
rpc /sbin/nologin
oprofile /sbin/nologin
vcsa /sbin/nologin
rtkit /sbin/nologin
abrt /sbin/nologin
hsqldb /sbin/nologin
avahi-autoipd /sbin/nologin
saslauth /sbin/nologin
postfix /sbin/nologin
apache /sbin/nologin
rpcuser /sbin/nologin
nfsnobody /sbin/nologin
haldaemon /sbin/nologin
gdm /sbin/nologin
ntp /sbin/nologin
pulse /sbin/nologin
tomcat /sbin/nologin
sshd /sbin/nologin
tcpdump /sbin/nologin
mysql /sbin/nologin

只显示/etc/passwd文件中的账户和账户对应的shell,账户与shell之间以逗号分隔,在所有行添加列名name,shell,在最后一行添加blue,/bin/nosh。

[root@localhost ~]# cat /etc/passwd |awk -F: 'BEGIN {print"name,sehll"} {print $1","$7}'
name,sehll
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
uucp,/sbin/nologin
operator,/sbin/nologin
games,/sbin/nologin
gopher,/sbin/nologin
ftp,/sbin/nologin
nobody,/sbin/nologin
dbus,/sbin/nologin
usbmuxd,/sbin/nologin
rpc,/sbin/nologin
oprofile,/sbin/nologin
vcsa,/sbin/nologin

搜索/etc/passwd文件中有root关键字的所有行

[root@localhost ~]# awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

搜索/etc/passwd文件中有root关键字开头的所有行。

[root@localhost ~]# awk -F: '/root/' /etc/passwd

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

[root@localhost ~]# awk -F: '{print"filename:"FILENAME",linenumber:"NR",\>columns:"NF",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,>columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,>columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd,linenumber:3,>columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
filename:/etc/passwd,linenumber:4,>columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
filename:/etc/passwd,linenumber:5,>columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
filename:/etc/passwd,linenumber:6,>columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync
filename:/etc/passwd,linenumber:7,>columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdo

统计/etc/passwd文件中的账户人数。

[root@localhost ~]# awk '{count++;print $0;} END{print "user count is", count}' /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
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
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
mysql:x:500:500::/home/mysql:/sbin/nologin
user count is 37

显示/etc/passwd文件中的账户,显示UID和用户名

[root@localhost ~]# awk -F':' 'BEGIN {count=0;} {name[count] = $1;count++;};\> END{for (i=0;i<NR;i++)print i,name[i]}' /etc/passwd

统计当前目录下文件占用的字节数

[root@localhost ~]# ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
[end]size is  67332105

统计当前目录下文件占用的MB数

[root@localhost ~]# ls -l |awk 'BEGIN {size=0;print "[start]size is",size} {if($5!=4096){size=size+$5;}} END{print "[end]size is",size/1024/1024,"MB"}'
[start]size is 0
[end]size is 64.1738 MB

Linux 命令大全

更多

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!