awk 文本处理几个简单的例子


一、简介

awk 是一款优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。

awk 提供了极其强大的功能,可以进行正则表达式的匹配,样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。

引用自:awk – 维基百科


二、命令用法

awk [选项] ['[模式] {指令1} {指令2} ... '] [输入文件]
选项 功能
-F 指定输入字段(列)分隔符。
-f 使用脚本文件。

awk 默认将处理结果输出至 stdout,如果不指定输入文件,则使用 stdin 输入。

模式 功能
BEGIN 在读取数据之前处理指令。
END 在读取所有数据结束之后处理指令。
常用变量(包含在指令中) 功能
\$0 所有字段(列)的内容。
\$n n 为正整数,代表第 n 个字段(列)的内容。
\$NF 最后一个字段(列)的内容。
NF 字段(列)的个数。
FS 输入字段(列)分隔符(默认为空格或制表符)。
OFS 输出字段(列)分隔符(默认为空格或制表符)。
RS 输入记录(行)分隔符(默认为换行符)。
ORS 输出记录(行)分隔符(默认为换行符)。
常用动作(包含在指令中) 功能
print 打印内容(默认值)。
printf 用法同 C 语言(可排版,强烈推荐使用)。

三、举例

3.1 示例文件内容

文件 1

这里用 df -h 命令运行的结果,显示各挂载点用量。

[root: ~]# cat test1.txt 
文件系统                              容量  已用  可用 已用% 挂载点
/dev/sda2                              62G  6.1G   53G   11% /
devtmpfs                              2.9G     0  2.9G    0% /dev
tmpfs                                 2.9G     0  2.9G    0% /dev/shm
tmpfs                                 2.9G  313M  2.6G   11% /run
tmpfs                                 2.9G     0  2.9G    0% /sys/fs/cgroup
/dev/sda1                             200M  9.5M  191M    5% /boot/efi
.host:/                               3.7T  1.2T  2.6T   31% /mnt/hgfs
tmpfs                                 580M     0  580M    0% /run/user/0

文件 2

这里用 cat /etc/passwd | head -n 10 命令运行的结果,显示本机用户信息。

[root: ~]# cat test2.txt 
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
operator:x:11:0:operator:/root:/sbin/nologin

3.2 举例说明

查看所有文件系统路径

[root: ~]# awk '{print $1}' test1.txt 

[root: ~]# awk '{printf "%s\n",$1}' test1.txt 

输出结果都一样

文件系统
/dev/sda2
devtmpfs
tmpfs
tmpfs
tmpfs
/dev/sda1
.host:/
tmpfs

查看各挂载点可用空间

[root: ~]# awk ' {print $6,$4}' test1.txt 
/ 53G
/dev 2.9G
/dev/shm 2.9G
/run 2.6G
/sys/fs/cgroup 2.9G
/boot/efi 191M
/mnt/hgfs 2.6T
/run/user/0 580M

我们优化一下排版。

[root: ~]# awk ' {printf "%-15s %-15s\n",$6,$4}' test1.txt
挂载点             可用             
/               53G            
/dev            2.9G           
/dev/shm        2.9G           
/run            2.6G           
/sys/fs/cgroup  2.9G           
/boot/efi       191M           
/mnt/hgfs       2.6T           
/run/user/0     580M   

查看各挂载点的已用空间和总大小

格式要求:<挂载点>:<已用>/<容量>

[root: ~]# awk '{printf "%s:%s/%s\n",$6,$3,$2}' test1.txt
挂载点:已用/容量
/:6.1G/62G
/dev:0/2.9G
/dev/shm:0/2.9G
/run:313M/2.9G
/sys/fs/cgroup:0/2.9G
/boot/efi:9.5M/200M
/mnt/hgfs:1.2T/3.7T
/run/user/0:0/580M

查看用户名,UID 和家目录

[root: ~]# awk 'BEGIN{FS=":"} {print $1,$3,$6}' test2.txt 
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
sync 5 /sbin
shutdown 6 /sbin
halt 7 /sbin
mail 8 /var/spool/mail
operator 11 /root

还是加个标题,然后处理下排版吧。

[root: ~]# awk 'BEGIN{FS=":"} {print $1,$3,$6}' test2.txt | sed '1i 用户 UID 家目录' | awk '{printf "%-15s%-15s%-15s\n",$1,$2,$3}'
用户             UID            家目录            
root           0              /root          
bin            1              /bin           
daemon         2              /sbin          
adm            3              /var/adm       
lp             4              /var/spool/lpd 
sync           5              /sbin          
shutdown       6              /sbin          
halt           7              /sbin          
mail           8              /var/spool/mail
operator       11             /root      

sed 和 awk 是一对好基友好闺蜜,可以通过管道让他们协同工作哦!

发表评论

电子邮件地址不会被公开。