在第二个命令中使用“grep”的输出作为变量

在第二个命令中使用“grep”的输出作为变量

我目前有 2 个 bash 命令行字符串,用于收集特定任务所需的数据。我试图简化操作,只使用一个命令来收集数据,而不使用脚本。

首先,我创建cat一个文件并通过管道输入grep命令,并且仅显示整数值。然后,我将该值复制并粘贴到方程中,该方程始终保持不变,除了grep第一个命令的 ped 值之外。

  • 第一个命令: cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$'
  • 第二条命令: echo $(( (2147483633-"**grep value**")/5184000 ))

我对如何实现这一目标感到困惑。任何有关这方面的指导将不胜感激!

答案1

这是一个命令:

echo $(( (2147483633 - $(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$') )/5184000 ))

简化是如何完成的

首先考虑这个管道:

cat /proc/zem0 |grep -i isrs`

这可以简化为:

grep -i isrs /proc/zem0

因此,第一个命令的整体变为:

grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'

最后一个更改是使用命令替换将第一个命令替换为第二个命令:$(...)。因此,我们替换:

echo $(( (2147483633-"**grep value**")/5184000 ))

和:

echo $(( (2147483633-$(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'))/5184000 ))

又一简化

如果您grep支持 perl 风格的正则表达式,例如 GNU grep,那么,正如 jimmij 在评论中建议的那样,可以进行进一步的简化:

echo $(( (2147483633-$(grep -Pio 'isrs.*?\K[0-9]+$' /proc/zem0))/5184000 ))

答案2

使用 John1024 回答的命令替换是解决此问题的最佳方法。

或者,您可以将输出通过管道传输到while read,这会将每个空格分隔的值分配给您选择的变量。当您的输出有多个您想要使用的变量时,通常会使用这一点。

cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$' | while read myvariable ; do echo $(( (2147483633-"${myvariable}")/5184000 )) ; done

while read对于柱状数据、将内容插入库存等确实很有用。例如,如果file1内容是:

host1 192.168.0.100 web nyc1 00-23-54-EE-10-5C
host2 192.168.0.101 web nyc2 00-23-54-EE-10-5D
host3 192.168.0.102 web nyc1 00-23-54-EE-10-5E

那么你可以做

cat file1 | while read host ip role dc mac ; do
    cobbler system add --name=${host} --ip-address=${ip} --netmask=255.255.255.0 --mac-address=${mac} --comments="${role} ${dc}"
done

相关内容