An̲*_*rew 48 unix math shell ksh
我确信有一种快速简便的方法来计算Unix系统上的一列值的总和(使用awk或类似的东西xargs),但是编写一个shell脚本来逐行解析行是唯一可行的方法.此刻心灵.
例如,修改下面命令以计算和显示SEGSZ列(70300)总数的最简单方法是什么?
ipcs -mb | head -6
IPC status from /dev/kmem as of Mon Nov 17 08:58:17 2008
T ID KEY MODE OWNER GROUP SEGSZ
Shared Memory:
m 0 0x411c322e --rw-rw-rw- root root 348
m 1 0x4e0c0002 --rw-rw-rw- root root 61760
m 2 0x412013f5 --rw-rw-rw- root root 8192
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 83
ipcs -mb | tail +4 | awk '{ sum += $7 } END { print sum }'
Run Code Online (Sandbox Code Playgroud)
或没有尾巴:
ipcs -mb | awk 'NR > 3 { sum += $7 } END { print sum }'
Run Code Online (Sandbox Code Playgroud)
使用awk和bc来获得任意长的结果(信用Jouni K.):
ipcs -mb | awk 'NR > 3 { print $7 }' | paste -sd+ | bc
Run Code Online (Sandbox Code Playgroud)
Pet*_*ino 13
我会尝试构建一个计算字符串并将其提供给bc,如下所示:
ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' + | bc
看起来这比awk解决方案略长,但对于那些无法阅读(并理解)奇怪的awk代码的人来说,这可能更容易掌握...... :-)
如果未安装bc,则可以在上面的步骤5中使用双括号来计算结果:
echo $(( $(ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' +) )) 要么SUM=$(( $(ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' +) )) 要么(( SUM=$(ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' +) ))双括号之前和之后的间距是可选的.