从文本中获取值并将其分配给变量
Grab value from text & assign it to a variable
我正在编写从系统文件中读取电池信息的脚本。
简单地说,我需要从 MAX_IBAT(mA): 3000 行中获取总电池容量 (3000);并将其放入变量中。
这是我正在阅读的文件的内容:
charging_source: NONE;
charging_enabled: 0;
overload: 0;
Percentage(%): 50;
Percentage_raw(%): 50;
gs_cable_impedance: 0
gs_R_cable_impedance: 0
gs_aicl_result: 0
batt_cycle_first_use: 2017/01/01/12:00:06
batt_cycle_level_raw: 26157;
batt_cycle_overheat(s): 0;
htc_extension: 0x0;
usb_overheat_state: 0;
USB_PWR_TEMP(degree): 304;
ISEN_VALUE_ADC: 228;
ISEN_VALUE: 0;
SOC(%): 27;
VBAT(mV): 3707;
IBAT(mA): 383;
IUSB(mA): 0;
MAX_IBAT(mA): 3000;
MAX_IUSB(mA): 0;
AICL_RESULT: 0
VBUS(uV): 0;
BATT_TEMP: 320;
HEALTH: 1;
BATT_PRESENT(bool): 1;
CHARGE_TYPE: 1;
CHARGE_DONE: 0;
USB_PRESENT: 0;
USB_ONLINE: 0;
CHARGER_TEMP: -1;
CHARGER_TEMP_MAX: 803;
CC_uAh: 889648;
USB_CMD_IL_REG: 0x00;
USBIN_CURRENT_LIMIT_CFG: 0x14;
USBIN_AICL_OPTIONS_CFG: 0xc4;
FAST_CHARGE_CURRENT_CFG: 0x78;
FG_BCL_LMH_STS1: 0x00;
我尝试过的:
awk '/^ +MAX_IBAT(mA): && $NF!=0{print $NF} Input_file
这使用“:”和“;”作为字段分隔符:
max_ibat=$(awk -F ': |;' '=="MAX_IBAT(mA)" {print }' file)
echo "$max_ibat"
输出:
3000
grep
解决方法:
-o
打印准确的输出而不是整行
- -P perl模式
(?<=MAX_IBAT\(mA\):\s)
lookbehind 断言只打印前面有字符串 'MAX_IBAT(mA): ' 的数字
命令:
max_ibat=$(grep -oP '(?<=MAX_IBAT\(mA\):\s)\d+' Input_file)
echo "$max_ibat"
输出:
3000
sed
解决方法:
-n
静默模式->默认不打印
/^MAX_IBAT(mA):/
只处理以 MAX_IBAT(mA):
开头的行
/s/[^0-9]//gp
将所有不是数字的字符替换为空(删除它们),然后用 p
. 打印
命令:
max_ibat=$(sed -n '/^MAX_IBAT(mA):/s/[^0-9]//gp' Input_file)
echo "$max_ibat"
输出:
3000
我正在编写从系统文件中读取电池信息的脚本。 简单地说,我需要从 MAX_IBAT(mA): 3000 行中获取总电池容量 (3000);并将其放入变量中。 这是我正在阅读的文件的内容:
charging_source: NONE;
charging_enabled: 0;
overload: 0;
Percentage(%): 50;
Percentage_raw(%): 50;
gs_cable_impedance: 0
gs_R_cable_impedance: 0
gs_aicl_result: 0
batt_cycle_first_use: 2017/01/01/12:00:06
batt_cycle_level_raw: 26157;
batt_cycle_overheat(s): 0;
htc_extension: 0x0;
usb_overheat_state: 0;
USB_PWR_TEMP(degree): 304;
ISEN_VALUE_ADC: 228;
ISEN_VALUE: 0;
SOC(%): 27;
VBAT(mV): 3707;
IBAT(mA): 383;
IUSB(mA): 0;
MAX_IBAT(mA): 3000;
MAX_IUSB(mA): 0;
AICL_RESULT: 0
VBUS(uV): 0;
BATT_TEMP: 320;
HEALTH: 1;
BATT_PRESENT(bool): 1;
CHARGE_TYPE: 1;
CHARGE_DONE: 0;
USB_PRESENT: 0;
USB_ONLINE: 0;
CHARGER_TEMP: -1;
CHARGER_TEMP_MAX: 803;
CC_uAh: 889648;
USB_CMD_IL_REG: 0x00;
USBIN_CURRENT_LIMIT_CFG: 0x14;
USBIN_AICL_OPTIONS_CFG: 0xc4;
FAST_CHARGE_CURRENT_CFG: 0x78;
FG_BCL_LMH_STS1: 0x00;
我尝试过的:
awk '/^ +MAX_IBAT(mA): && $NF!=0{print $NF} Input_file
这使用“:”和“;”作为字段分隔符:
max_ibat=$(awk -F ': |;' '=="MAX_IBAT(mA)" {print }' file)
echo "$max_ibat"
输出:
3000
grep
解决方法:
-o
打印准确的输出而不是整行- -P perl模式
(?<=MAX_IBAT\(mA\):\s)
lookbehind 断言只打印前面有字符串 'MAX_IBAT(mA): ' 的数字
命令:
max_ibat=$(grep -oP '(?<=MAX_IBAT\(mA\):\s)\d+' Input_file)
echo "$max_ibat"
输出:
3000
sed
解决方法:
-n
静默模式->默认不打印/^MAX_IBAT(mA):/
只处理以MAX_IBAT(mA):
开头的行
/s/[^0-9]//gp
将所有不是数字的字符替换为空(删除它们),然后用p
. 打印
命令:
max_ibat=$(sed -n '/^MAX_IBAT(mA):/s/[^0-9]//gp' Input_file)
echo "$max_ibat"
输出:
3000