
awk命令中的变量赋值给外部的变量
awk使用截取指定的行,并把该行对应的列值赋值给外部变量。
以以下命令为例
echo "$output" | awk 'NR==3 {printf "%0.2f %0.2f", $3/1048576, $4/1048576}'
管道操作符 (|
)
- 作用:连接两个命令,左边命令的输出作为右边命令的输入。
- 示例:
echo "$output"
的输出被传递给awk
命令。
awk
命令
- 功能:
awk
是一个文本处理工具,用于模式匹配和数据提取。 - 解析:
NR==3
:NR是awk的内置变量,表示当前处理的行号。确保只处理第三行的数据。printf "%0.2f %0.2f", $3/1048576, $4/1048576
:格式化打印函数,输出为浮点数,保留两位小数;$3
和$4
分别代表第三列和第四列的字段,/1048576
将单位从字节转换为GB。
read quota_used quota_size <<<
read
命令:从标准输入读取一行并分配给 Shell 变量。- **Here String (
<<<
)**:重定向机制,将字符串作为命令的标准输入,直接将awk
输出传递给read
命令,无需使用管道或临时文件。
总结
此段脚本从 $output
中提取第三行的第三和第四列数据,将这些数据从KB转换为兆字节(GB),保留两位小数,最后将结果赋值给 quota_used
和 quota_size
变量。这是一种高效处理和格式化文本数据的方法,尤其适用于自动化脚本中。
从配置文件中提取键值的 Bash 脚本教程
在 Bash 脚本中,解析配置文件是常见需求。本教程将介绍如何从配置文件中提取键值对,保证高效、精准的匹配,并去除不必要的空格。我们将使用 grep
和 awk
来达到这一目的,同时简要说明每一步的作用。
场景概述
假设我们有一个配置文件 appform.conf
,其格式如下:
# appform.conf 示例 USERS_DIR=/home/appform/users inner.arbitrate.ip = 192.168.1.1 db.password = my_secure_password
目标是提取键为 inner.arbitrate.ip
的值,并去除任何不必要的空格。
方法概述
推荐使用 grep
和 awk
来筛选和处理目标键值对。grep
负责精准定位包含特定键的行,而 awk
将键与值分开,以 =
为分隔符。
脚本示例
以下是从 appform.conf
文件中提取 inner.arbitrate.ip
值的 Bash 脚本:
# 定义配置文件路径 CONFIG_FILE="${NACOS_DATA_DIR}/appform/appform.conf" # 提取 inner.arbitrate.ip 的值 INNER_ARBITRATE_IP=$(grep "^\s*inner.arbitrate.ip\s*=\s*.*$" "$CONFIG_FILE" | awk -F= '{print $2}' | sed 's/^ *//;s/ *$//') # 打印提取的值 echo "Inner Arbitrate IP: $INNER_ARBITRATE_IP"
脚本分析
定义配置文件路径
CONFIG_FILE="${NACOS_DATA_DIR}/appform/appform.conf"
确保配置文件路径正确。
grep
精准匹配目标行grep "^\s*inner.arbitrate.ip\s*=\s*.*$" "$CONFIG_FILE"
解释:
^\s*
:匹配行首的空白字符(如空格或制表符),即使键前有空白字符也能匹配。inner.arbitrate.ip
:确保完全匹配inner.arbitrate.ip
。\s*=\s*
:匹配=
前后的空白字符。.*$
:匹配键值部分及后续内容。
使用
awk
分隔键值| awk -F= '{print $2}'
-F=
:指定=
为分隔符。{print $2}
:输出分隔符右侧的内容(即键的值)。
sed
去除值的前后空格| sed 's/^ *//;s/ *$//'
s/^ *//
:去除值前面的空格。s/ *$//
:去除值后面的空格。
输出结果
bash
复制代码
echo "Inner Arbitrate IP: $INNER_ARBITRATE_IP"
将提取到的值输出,以确认正确性。
总结
- 使用
grep
精准定位目标行,确保匹配特定键。 - 通过
awk
解析并提取值,利用sed
清理空格,以保证结果整洁。 - 这种方法适用于大多数
key=value
格式的配置文件,并可以扩展到其他键值提取需求。1
INNER_ARBITRATE_IP=$(grep "^\s*inner.arbitrate.ip\s*=\s*.*$" "$CONFIG_FILE" | awk -F= '{print $2}' | sed 's/^ *//;s/ *$//')