論壇網(wǎng)站建設(shè)軟件網(wǎng)站優(yōu)化公司認(rèn)準(zhǔn)樂云seo
一 概述
awk命令是一種分析和處理文本文件的編程工具。它的功能非常強(qiáng)大,是Linux/Unix系統(tǒng)中最常用的過濾工具。
awk內(nèi)建變量:
NF 整個數(shù)據(jù)行(即$0)擁有的字段總數(shù)
NR 當(dāng)前awk所處理的數(shù)據(jù)行的編號
$0 當(dāng)前awk所處理的數(shù)據(jù)行
$1 數(shù)據(jù)行的第1個字段
$2 數(shù)據(jù)行的第2個字段
$NF 數(shù)據(jù)行的最后1個字段
注意:
和shell腳本中的變量不同,awk中的變量可以直接使用,不需要加上$符號
二 awk簡單實例
2.1 查看服務(wù)器登入者的用戶名和IP地址
last | awk '{print $1 "\t" $3}'
last -n 10 | awk '{print $1 "\t" $3}'
2.2 查找root用戶的默認(rèn)shell
方法一:
awk -F: '/^root/ {print $7}' /etc/passwd
執(zhí)行結(jié)果為:/bin/bash
方法二:
awk -F: '{if ($1 == "root") print $7}' /etc/passwd
執(zhí)行結(jié)果為:/bin/bash
上述兩個命令的執(zhí)行結(jié)果相同,其中:
-F:設(shè)置分隔符為冒號,默認(rèn)分割符為空格或者[Tab]
‘/^root/ {print $7}’:通過正則表達(dá)式匹配以root開頭的行,匹配成功后打印該行的第7列,即第7個字段
方法二中使用了條件語句,為了實際編程需要,awk命令中可以嵌入條件語句,條件語句的關(guān)鍵字是if
下圖所示為條件語句的運(yùn)算符:
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 等于
!= 不等于
2.3 從詳細(xì)路徑中提取文件名
echo "/root/dummy_app/tools/cloud/make_update_package.sh" | awk -F/ '{print $NF}'
-F:設(shè)置分隔符為正斜杠/,默認(rèn)分割符為空格或者[Tab]
$NF:表示數(shù)據(jù)行的最后1個字段
上述命令的執(zhí)行結(jié)果為: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在開始處理數(shù)據(jù)行之前,先執(zhí)行BEGIN關(guān)鍵字指定的操作,即BEGIN關(guān)鍵字后面花括號里的內(nèi)容,通常來說都是些打印標(biāo)題信息、初始化變量等操作
END:表示awk在處理完所有數(shù)據(jù)行之后,再執(zhí)行END關(guān)鍵字指定的操作,即END關(guān)鍵字后面花括號里的內(nèi)容,通常來說都是些打印結(jié)束欄、輸出最終結(jié)果等操作
注意:
無論是BEGIN還是END,它們都只會執(zhí)行一次
2.5 解析配置文件-實例一
下圖所示為配置文件詳細(xì)內(nèi)容:
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
運(yùn)行腳本并且查看結(jié)果
./parse.sh package_config
index_file
update_full
v0.1
v4.19.115
md5
/etc/menxian_private.pem
我們抽取一行進(jìn)行分析:
index_file=$(awk '/^index_file/ {print $2}' $package_config)
/^index_file/:表示匹配以index_file開頭的行
/index_file$/:表示匹配以index_file結(jié)尾的行
$():將整個命令執(zhí)行結(jié)果,賦值給變量
需要注意的是:$()會將多行的執(zhí)行結(jié)果合并成一行,然后賦值給變量
咱們可以使用如下命令進(jìn)行測試:
result=$(df -hT); echo $result;
2.6 解析配置文件-實例二
下圖所示為配置文件詳細(xì)內(nèi)容:
[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
運(yùn)行腳本并且查看結(jié)果
./parse.sh payload_desc
update_full
v1.4.0
v4.19.115
md5
我們同樣抽取一行進(jìn)行分析
payload_type=$(awk '/\[payload_type]/ {getline; print $1}' $configfile)
/[payload_type]/:表示匹配包含[payload_type]的行,在awk中[符號需要使用\[進(jìn)行轉(zhuǎn)義,]符號就不需要