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_usedquota_size 变量。这是一种高效处理和格式化文本数据的方法,尤其适用于自动化脚本中。

从配置文件中提取键值的 Bash 脚本教程

在 Bash 脚本中,解析配置文件是常见需求。本教程将介绍如何从配置文件中提取键值对,保证高效、精准的匹配,并去除不必要的空格。我们将使用 grepawk 来达到这一目的,同时简要说明每一步的作用。

场景概述

假设我们有一个配置文件 appform.conf,其格式如下:

# appform.conf 示例 USERS_DIR=/home/appform/users inner.arbitrate.ip = 192.168.1.1 db.password = my_secure_password

目标是提取键为 inner.arbitrate.ip 的值,并去除任何不必要的空格。

方法概述

推荐使用 grepawk 来筛选和处理目标键值对。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"

脚本分析

  1. 定义配置文件路径

    CONFIG_FILE="${NACOS_DATA_DIR}/appform/appform.conf"

    确保配置文件路径正确。

  2. grep 精准匹配目标行

    grep "^\s*inner.arbitrate.ip\s*=\s*.*$" "$CONFIG_FILE"

    解释:

    • ^\s*:匹配行首的空白字符(如空格或制表符),即使键前有空白字符也能匹配。
    • inner.arbitrate.ip:确保完全匹配 inner.arbitrate.ip
    • \s*=\s*:匹配 = 前后的空白字符。
    • .*$:匹配键值部分及后续内容。
  3. 使用 awk 分隔键值

    | awk -F= '{print $2}'

    • -F=:指定 = 为分隔符。
    • {print $2}:输出分隔符右侧的内容(即键的值)。
  4. sed 去除值的前后空格

    | sed 's/^ *//;s/ *$//'

    • s/^ *//:去除值前面的空格。
    • s/ *$//:去除值后面的空格。
  5. 输出结果

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

输入图片说明