我目前有 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