【问题标题】:How can I sort a Bash output and save it to a sql db如何对 Bash 输出进行排序并将其保存到 sql db
【发布时间】:2021-05-20 01:11:53
【问题描述】:

我一直在尝试从此命令ioreg -r -c "AppleSmartBattery" 获取数据并将其每个输入保存到 sql db

$ ioreg -r -c "AppleSmartBattery"
+-o AppleSmartBattery {
"剩余时间" = 179
"AvgTimeToEmpty" = 179
"AdapterDetails" = {​​"FamilyCode"=0}
“充电超控”= 0
"AppleRawCurrentCapacity" = 2373
"InstantTimeToEmpty" = 154
"AppleRawMaxCapacity" = 3811
"ExternalChargeCapable" = 否

我需要将它保存到一个 sql 表中,其中一列是“*”,下一列是等于之后的值
我正在尝试构建一个“for循环”,但我已经走到了这一步,我无法弄清楚如何继续

batstat=$(ioreg -r -c "AppleSmartBattery")
for i in ${batstat[@]}; do
sed 's/^[^{]*{\([^{}]*\)}.*/\1/' $i
echo $i
done

我需要完成以下工作

  1. 每次 for 逐行执行时,在引号 "" 中获取一个值
  2. 将等号后的正确值分配给相应的引用值

谢谢:)

【问题讨论】:

标签: mysql bash macos terminal


【解决方案1】:

并不是说不可能,但我认为如果有更简单的解决方案可用,完全在 shell 脚本中执行此操作有点多。

我在这里要做的是将输出转换为 JSON,然后使用像 JSON-to-SQL 这样的 Node 模块从 JSON 模式生成表,并使用 JSON-SQL 将输出转换为 INSERT 语句,这然后,您可以使用任何 Node SQL 客户端,例如 sql-client

您还可以使用 sh 之类的模块在 Node 中更清晰、更轻松地解析输出,以捕获 ioreg 命令输出,但这是我想出的将命令输出转换为有效 JSON 的方法。

#!/bin/bash

function parseData() {
  tail -n +2 $1 | \
  sed -re 's/\=/\:/g' | \
  sed -re 's/</\"/g' | \
  sed -re 's/>/\"/g' | \
  sed -re 's/No/false/g' | \
  sed -re 's/Yes/true/g' | \
  sed -re 's/\(/\[/g' | \
  sed -re 's/\)/\]/g' | \
  sed '$d' | \
  sed '$d' | \
  sed 's/$/,/' | \
  sed '1 s/\,//' | \
  sed '$ s/\,//' | \
  sed '52 s/,//'
}

ioreg -r -c "AppleSmartBattery" | parseData

唯一的问题是,如果输出中的行数发生变化,parseData 函数最后一行中的 52 将需要更新。

【讨论】:

  • 我明白了,我会尝试构建它以检查它的工作原理,谢谢 :)
猜你喜欢
  • 2022-11-22
  • 2017-08-01
  • 1970-01-01
  • 2014-03-30
  • 2016-03-24
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多