网站推广属于什么行业免费搭建个人业务网站
一 概述
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=$1index_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=$1payload_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中[符号需要使用\[进行转义,]符号就不需要
