一 概述
awk命令是一种分析和处理文本文件的编程工具。它的功能非常强大,是Linux/Unix系统中最常用的过滤工具。
awk内建变量:
NF 整个数据行(即$0)拥有的字段总数
NR 当前awk所处理的数据行的编号
$0 当前awk所处理的数据行
$1 数据行的第1个字段
$2 数据行的第2个字段
$NF 数据行的最后1个字段
注意:
和shell脚本中的变量不同,awk中的变量可以直接使用,不需要加上$符号
二 awk简单实例
2.1 查看服务器登入者的用户名和IP地址
last | awk '{print $1 "\t" $3}'
last -n 10 | awk '{print $1 "\t" $3}'
2.2 查找root用户的默认shell
方法一:
awk -F: '/^root/ {print $7}' /etc/passwd
执行结果为:/bin/bash
方法二:
awk -F: '{if ($1 == "root") print $7}' /etc/passwd
执行结果为:/bin/bash
上述两个命令的执行结果相同,其中:
-F:设置分隔符为冒号,默认分割符为空格或者[Tab]
‘/^root/ {print $7}’:通过正则表达式匹配以root开头的行,匹配成功后打印该行的第7列,即第7个字段
方法二中使用了条件语句,为了实际编程需要,awk命令中可以嵌入条件语句,条件语句的关键字是if
下图所示为条件语句的运算符:
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 等于
!= 不等于
2.3 从详细路径中提取文件名
echo "/root/dummy_app/tools/cloud/make_update_package.sh" | awk -F/ '{print $NF}'
-F:设置分隔符为正斜杠/,默认分割符为空格或者[Tab]
$NF:表示数据行的最后1个字段
上述命令的执行结果为:make_update_package.sh
2.4 计算某个目录下所有文件大小的总和
ls -l /boot | grep ^- | awk 'BEGIN{totalsize = 0;} {totalsize += $5;} END{print totalsize}'
从上述语句可以看出:awk中的变量可以直接使用,不需要加上$符号
ls -l /boot | grep ^-:表示只查找普通文件
ls -l /boot | grep ^d:表示只查找目录
BEGIN:表示awk在开始处理数据行之前,先执行BEGIN关键字指定的操作,即BEGIN关键字后面花括号里的内容,通常来说都是些打印标题信息、初始化变量等操作
END:表示awk在处理完所有数据行之后,再执行END关键字指定的操作,即END关键字后面花括号里的内容,通常来说都是些打印结束栏、输出最终结果等操作
注意:
无论是BEGIN还是END,它们都只会执行一次
2.5 解析配置文件-实例一
下图所示为配置文件详细内容:
index_file index_file
payload_type update_full
system_version v0.1
kernel_version v4.19.115
digest_type md5
private_pem /etc/menxian_private.pem
解析脚本如下所示:
#! /bin/sh
package_config=$1
index_file=$(awk '/^index_file/ {print $2}' $package_config)
payload_type=$(awk '/^payload_type/ {print $2}' $package_config)
system_version=$(awk '/^system_version/ {print $2}' $package_config)
kernel_version=$(awk '/^kernel_version/ {print $2}' $package_config)
digest_type=$(awk '/^digest_type/ {print $2}' $package_config)
private_pem=$(awk '/^private_pem/ {print $2}' $package_config)
echo $index_file
echo $payload_type
echo $system_version
echo $kernel_version
echo $digest_type
echo $private_pem
运行脚本并且查看结果
./parse.sh package_config
index_file
update_full
v0.1
v4.19.115
md5
/etc/menxian_private.pem
我们抽取一行进行分析:
index_file=$(awk '/^index_file/ {print $2}' $package_config)
/^index_file/:表示匹配以index_file开头的行
/index_file$/:表示匹配以index_file结尾的行
$():将整个命令执行结果,赋值给变量
需要注意的是:$()会将多行的执行结果合并成一行,然后赋值给变量
咱们可以使用如下命令进行测试:
result=$(df -hT); echo $result;
2.6 解析配置文件-实例二
下图所示为配置文件详细内容:
[payload_type]
update_full
[system_version]
v1.4.0
[kernel_version]
v4.19.115
[digest_type]
md5
解析脚本如下所示:
#! /bin/sh
configfile=$1
payload_type=$(awk '/\[payload_type]/ {getline; print $1}' $configfile)
system_version=$(awk '/\[system_version]/ {getline; print $1}' $configfile)
kernel_version=$(awk '/\[kernel_version]/ {getline; print $1}' $configfile)
digest_type=$(awk '/\[digest_type]/ {getline; print $1}' $configfile)
echo $payload_type
echo $system_version
echo $kernel_version
echo $digest_type
运行脚本并且查看结果
./parse.sh payload_desc
update_full
v1.4.0
v4.19.115
md5
我们同样抽取一行进行分析
payload_type=$(awk '/\[payload_type]/ {getline; print $1}' $configfile)
/[payload_type]/:表示匹配包含[payload_type]的行,在awk中[符号需要使用\[进行转义,]符号就不需要