
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/ *$//')






