awk 是什么? awk 是linux 最常用的处理文本文件的工具之一, 与另外两个 grep,sed 并称linux 文本处理三大利器
awk 之所以会叫awk是因为取自他们的发明者名字 Alfred Aho,Peter Weinberger, 和 Brian Kernighan
awk 最核心的处理模式是逐行处理文本,然后对此行文件进行一些处理,awk单独拿出来可以写一本书,我还真见过那本书,本文只介绍最基本常用的用法
awk 的逻辑:按照输入的文件一行一行的处理,并将处理结果打印出来,也就是说,输出的结果是多行的,对每行进行处理的结果
1: 输出指定的列
很多时候,对与文本中的一行来说,我们可以选择打印指定的列,以/etc/passwd为例子:
1 2 3 4 |
$ cat /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin test1:x:1000:1000::/home/test1:/bin/bash |
如果我们只是想看看用户名和home目录,我们可以使用如下的命令
1 2 3 4 |
awk -F ':' '{print $1, $6}' /etc/passwd apache /usr/share/httpd dockerroot /var/lib/docker test /home/test |
awk 的命令格式为: awk 操作 文件名
上边的命令特殊的地方在于-F : 这个参数指定的是分隔符,awk默认的分隔符是空格“ ”,也就是说,如果我们有一行:
1 |
第一列 第二列 第三列 第四列 第五列 |
awk会帮我们把这行按照空格进行分组, 第一组就是 第一列,第二组就是第二列….,并把这个组按照顺序分配给$1 $2 ….意思就是说,$2 === “第二列”,我们继续说/etc/passwd的例子,因为文件并不是使用空格分割的,所以我们必须使用自定义的分隔符“:” ,然后我们的操作是打印$1 和$6,就是打印以冒号“:”分割成的组后的第1个组和第6个组
按照红圈展示的话,打印结果正好是用户名和家目录
2: 条件判断
很多时候,我们希望做一些简单的判断,例如,如果第一列的值是apache的用户的话,我们才会打印第1列和第6列
1 2 |
awk -F ':' '$1 == "apache" {print $1, $6}' /etc/passwd apache /usr/share/httpd |
如上名的命令展示的,因为我们加入了判断第一列是否为apache,输出的内容仅剩一行,因为其他的行并不符合判断条件,另外awk额外还提供了更加完整的if判断模式,大家需要的话可以自行搜索
3:内置函数
awk内置了一些函数让我们使用,例如大写函数toupper,作用是将所有字符转换为大写,我们对比一下使用和不使用的情况
1 2 3 4 |
awk -F ':' '$1 == "apache" {print $1, $6}' /etc/passwd apache /usr/share/httpd [root@k8s ~]# awk -F ':' '$1 == "apache" {print toupper($1), $6}' /etc/passwd APACHE /usr/share/httpd |
第二次的时候我们就发现$1已经自动转换为大写了
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021