我有一个 bash 脚本,其中包含一组数据库名称,连接到每个数据库名称并在它们上运行存储过程。我需要从存储过程的输出中获取值并在脚本的其余部分使用它们。许多输出是这样的:
CONDBAT= 10000 MDBAT= 400 ADBAT= 143 QUEDBAT= 167924 INADBAT= 0
然后我注意到一些数据库在没有空格的情况下有不同的输出:
CONDBAT=4000 MDBAT=1200 ADBAT=263 QUEDBAT=7924 INADBAT=0
我需要在 QUEDBAT 之后获取值并将其存储为变量。我的问题是我无法获得两个输出的值。我尝试了很多命令。例如:
grep -Eo 'QUEDBAT=([[:space:]]+[^[:space:]]+){1}'
grep -vE -e 'QUEDBAT=[[:space:]]{4}' -e '^[^[:space:]]*$'
grep -oP '(?<=QUEDBAT\=)(\s+)?\K([^ ]*)'
但他们不会返回两个输出的值。QUEDBAT 忽略任何空格后如何获取值?
我无法编写单独的脚本,因为我需要一个脚本中所有数据库的所有输出。每次我运行存储过程时,值都会改变,所以你不能确定每个部分的值是 3 位还是 4 位。而且我无法得到介于两者之间的内容=
,ADBAT
因为有时输出的顺序会不一样。
+
是一个或多个。您需要*
零个或多个:或者:
或者使用真实的东西(上面的
P
/p
是用于perl
)的可移植性:(或者编写你的整个脚本,
perl
如果它主要是关于文本处理,可能会更合适)。每当您的输入有标签=值对时,我发现最好首先创建一个数组来保存
f[]
下面的这些映射 (),然后您可以按任何输入顺序获取您喜欢的值,比较它们,重新排序它们等等。只是他们的标签。在每个 Unix 机器上的任何 shell 中使用任何 awk 都可以满足您的特别要求:但是通过首先使用这种构建标签值数组的方法,您可以做更多的事情,例如:
tr+ sed
管道可以在我们在线使用“=”分隔字段的地方使用。GNU sed
也可以单独使用。结果:
用于遍历
awk
字段,当遇到所需字段时,检查下一个。如果它为空 => 我们有QUEDATA= xxxx
,那么我们需要从当前打印第二个,否则为下一个。然后我们增加字段索引计数器,这样我们就不会重新检查下一个/下一个+1 字段。输出