Linux awk命令

Linux awk命令:模式扫描和处理语言

Linux awk命令 功能描述

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

Linux awk命令 语法

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

命令中各选项的含义如下表所示。

Linux awk命令 语法

AWK有许多内置变量用来设置环境信息,这些变量可以被改变,下表给出了最常用的一些变量。

Linux awk命令 语法

在AWK中字符串常量是双引号括起来的字符序列,下表列出了常用的字符串常量。

Linux awk命令 语法

Linux awk命令 示例

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

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

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

[root@rhel ~]# cat /etc/passwd |awk -F ':' '{print $1}'
root
bin
daemon
adm
lp
sync
shutdown
halt
..........................(省略)

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

[root@rhel ~]# 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
........................(省略)

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

[root@rhel~]#shell''}{print1'', ''7}\
>END{print''blue, /bin/nosh''}'
name, shell
root, /bin/bash
bin, /sbin/nologin
daemon, /sbin/nologin
adm, /sbin/nologin
lp, /sbin/nologin
sync, /bin/sync
shutdown, /sbin/shutdown
halt, /sbin/halt
........................(中间省略部分内容)
tcpdump, /sbin/nologin
radiusd, /sbin/nologin
blue, /bin/nosh

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

[root@rhel ~]# 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@rhel ~]# awk -F: '/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

搜索/etc/passwd文件中有root关键字的所有行,并显示对应的Shell

[root@rhel ~]# awk -F: '/root/{print $7}' /etc/passwd
/bin/bash
/sbin/nologin

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

[root@rhel ~]# 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/shutdown
filename:/etc/passwd, linenumber:8, columns:7, linecontent:halt:x:7:0:halt:/sbin:/sbin/halt
filename:/etc/passwd, linenumber:9, columns:7, linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
........................(省略)

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

[root@rhel ~]# 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
........................(中间省略部分内容)
cyrus:x:76:12:Cyrus IMAP Server:/var/lib/imap:/sbin/nologin
ldap:x:55:55:LDAP User:/var/lib/ldap:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
radiusd:x:95:95:radiusd user:/home/radiusd:/sbin/nologin
user count is 67

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

[root@rhel~]#awk-F':''BEGIN{count=0; }{name[count]=$1; count++; }; \
> END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 bin
2 daemon
3 adm
4 lp
5 sync
6 shutdown
7 halt
8 mail
9 uucp
10 operator
11 games
12 gopher
........................(省略)

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

[root@rhel ~]# ls -l |awk 'BEGIN {size=0; } {size=size+$5; } END{print ''[end]size is '', size}'
[end]size is 170057
//统计不包括目录下的子目录

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

[root@rhel ~]# ls -l |awk 'BEGIN {size=0; } {size=size+$5; } \
> END{print ''[end]size is '', size/1024/1024, ''MB''}'
[end]size is 0.162179 MB

统计当前目录下的文件占用的MB数,过滤4096字节大小的文件(一般都是文件夹)

[root@rhel ~]# 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 0.130929 MB

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程