在Linux系统下,经常会有一些计算需求,那么下面就简单梳理下几个常用到的计算命令

一、bc 命令
bc命令是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下
常用参数选项:
-i:强制进入交互式模式;
-l:定义使用的标准数学库;
-w:对POSIX bc的扩展给出警告信息;
-q:不打印正常的GNU bc环境信息;
-v:显示指令版本信息;
-h:显示指令的帮助信息。

在bc工作环境下,可以使用以下计算符号:
+    加法
-     减法
*    乘法
/     除法
^    指数
%   余数
其中,在做“除法计算”或“余数计算”时,可以使用scale指定小数点之后的位数(默认为0,即整数)

实例说明:

[root@slave-server ~]# bc -v
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
[root@slave-server ~]# bc <<< 5*4
20
[root@slave-server ~]# bc <<< 5+4
9
[root@slave-server ~]# bc <<< 50-14
36
[root@slave-server ~]# bc <<< 50/10
5
[root@slave-server ~]# bc <<< 50/3
16
[root@slave-server ~]# bc <<< 3^3
27

如下,进入交互模式:也可以一行输入多个计算,用逗号;相隔。

[root@slave-server ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
3+10
13
10-5
5
10*10
100
10^2
100
10/2
5
10/3
3
scale=4
10/3
3.3333
10%3
.0001
3+4;5*2;5^2;18/4
7
10
25
4.5000
10^3;100+50;4000-598;33*8;899/34
1000
150
3402
264
26.4411

以上是使用交互的计算,也可以不进行交互而直接计算出结果。
结合echo 和 "|" 符合
[root@slave-server ~]# echo "(6+3)*2" |bc
18
[root@slave-server ~]# echo 15/4 |bc
3
[root@slave-server ~]# echo "scale=2;15/4" |bc
3.75
[root@slave-server ~]# echo "scale=2;100/30*100-98;20+45;90-70;15^2" |bc
235.00
65
20
225
[root@slave-server ~]# echo "3+4;5*2;5^2;18/4" |bc
7
10
25
4
bc除了scale来设定小数位之外,还有ibase和obase来其它进制的运算
如下实例:
将16进制的A7输出为10进制, 注意,英文只能大写
[root@slave-server ~]# echo "ibase=16;A7" |bc
167
将2进制的11111111转成10进制
[root@slave-server ~]# echo "ibase=2;11111111" |bc
255
输入为16进制,输出为2进制
[root@slave-server ~]# echo "ibase=16;obase=2;B5-A4" |bc
10001

除此之外bc后可以接文件名(指定包含计算任务的文件)

[root@slave-server ~]# cat calc.txt
20+89
56-17
34*45
30/8
2^5
scale=5
100/3
200%17
[root@slave-server ~]# bc calc.txt
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
109
39
1530
3
32
33.33333
.00010 不打印正常的GNU信息
[root@slave-server ~]# bc -q calc.txt
109
39
1530
3
32
33.33333
.00010 [root@slave-server ~]# bc -q < calc.txt
109
39
1530
3
32
33.33333
.00010
[root@slave-server ~]#

也可以使用HERE 命令

[root@slave-server ~]# bc << HERE
> 30+56
> 30-14
> 30*5
> scale=3
> 30/7
> 10%3
> 2^7
HERE
86
16
150
4.285
.001
128

可以使用内置的变量last引用上一次的结果

[root@slave-server ~]# echo "50*4;last+100" | bc
200
300

last也可以用点号代替

[root@slave-server ~]# echo "50*4;.+100" | bc
200
300

脚本模拟计算器

[root@slave-server ~]# cat bc.sh
#!/bin/bash
bc << EOF
scale=2
$@
EOF
[root@slave-server ~]# chmod 755 bc.sh
[root@slave-server ~]# ./bc.sh 10*2
20
[root@slave-server ~]# ./bc.sh 10+32
42
[root@slave-server ~]# /bin/bash bc.sh 100/3
33.33
[root@slave-server ~]# /bin/bash -x bc.sh 100%13
+ bc
.03

二、expr 命令
expr命令不光能计算加减乘除,还有很多表达式都可以计算出结果。
不过有一点需要注意,在计算加减乘除时,不要忘了使用空格和转义。
实例说明:

[root@slave-server ~]#  expr 6 + 3                //注意中间都有空格
9
[root@slave-server ~]# expr 2 \* 3 //注意乘法符号*前面有转义符号
6
[root@slave-server ~]# expr 14 % 9
5
[root@slave-server ~]# a=3
[root@slave-server ~]# expr $a + 5 //注意有变量,有空格
8
[root@slave-server ~]# a=`expr 4 + 2`
[root@slave-server ~]# echo $a
6

expr对于字串的操作(计算)也很方便

[root@slave-server ~]# expr length "yangzhigang.cublog.cn"
21

从位置处抓取字串

[root@slave-server ~]# expr substr "yangzhigang.cublog.cn" 1 11
yangzhigang

字串开始处

[root@slave-server ~]# expr index "yangzhigang.cublog.cn" cu
13

三、echo命令
echo用来进行回显,是周知的事。上面也配合bc来进行计算。其实echo也可以单独进行简单的计算

[root@slave-server ~]# echo $((3+5))
8
[root@slave-server ~]# echo $(((3+5)*2))
16

echo还可以进行变量的计算

[root@slave-server ~]# a=10
[root@slave-server ~]# b=5
[root@slave-server ~]# echo $(($a+$b))
15
[root@slave-server ~]# echo $a+$b
10+5
[root@slave-server ~]# echo $a+$b |bc
15

计算前天的日期

[root@slave-server ~]# echo `date +%Y%m%d`
20170204
[root@slave-server ~]# echo `date +%Y%m%d`-2
20170204-2
[root@slave-server ~]# echo `date +%Y%m%d`-2 |bc
20170202

四、AWK命令
awk在处理文件的时,可以进行运算,那当然也可以单单用来计算了

[root@slave-server ~]# awk 'BEGIN{a=3+2;print a}'
5
[root@slave-server ~]# awk 'BEGIN{a=(3+2)*2;print a}'
10
[root@slave-server ~]# awk 'BEGIN{a=(3+2)*2;b=(5+8)*10/5;print a,b}'
10 26
[root@slave-server ~]# awk 'BEGIN{a=(3+2)*2;b=(5+8)*10/5;print 2a,3b}'
210 326
[root@slave-server ~]# awk 'BEGIN{a=(3+2)*2;b=(5+8)*10/5;c=5^2;print a,b,3c}'
10 26 325

求和、平均值、最值
[root@redis-server1 ~]# cat a
1
2
3
4
5
2333

0) 求和
[root@redis-server1 ~]# awk '{a+=$1}END{print a}' a
2348

1) 求最大值
[root@redis-server1 ~]# awk '$0>a{a=$0}END{print a}' a
2333

2) 求最小值(思路:先定义一个最大值)
[root@redis-server1 ~]# awk 'BEGIN{a=9999999}{if($1<a) a=$1 fi}END{print a}' a
1

3)求平均值
第一种方法:在上面求和的基础上,除以参数个数
[root@redis-server1 ~]# awk '{a+=$1}END{print a/NR}' a
391.333

第二种方法:写脚本
[root@redis-server1 ~]# cat avg.sh

#!/bin/bash
let sum=0
for num in $*;do
let sum=$sum+$num
done
echo "scale=3;$sum/$#"|bc

[root@redis-server1 ~]# chmod 755 avg.sh
[root@redis-server1 ~]# ./avg.sh `cat a`
391.333

[root@redis-server1 ~]# ./avg.sh 40 45 60
48.333
.....................
$? 上一个命令结果的返回值,0是正确,非0是错误的
$0 当前程序名
$n 命令行参数,比如$1是第一个参数,$2是第二个参数,$3是第三个参数.....
$# 命令行参数的个数
$* 格式形如$1 $2 $3 $4 ... $n
$@ 格式形如"$1" "$2" "$3" "$4" ... "$n"

示例一                                                   
[root@redis-server1 ~]# cat a.txt
A 88
B 78
B 89
C 44
A 98
C 433

取得结果为:[root@redis-server1 ~]# cat a.txt|awk -F" " '{print $1}'|sort|uniq
A
B
C

第一种方法:
[root@redis-server1 ~]# cat a.txt|awk -F" " '{print $1}'|sort|uniq
A
B
C
[root@redis-server1 ~]# for i in `cat a.txt|awk -F" " '{print $1}'|sort|uniq`;do cat a.txt|grep $i|xargs;done
A 88 A 98
B 78 B 89
C 44 C 433
[root@redis-server1 ~]# for i in `cat a.txt|awk -F" " '{print $1}'|sort|uniq`;do cat a.txt|grep $i|xargs;done|awk '{print $1,$2,$4}'
A 88 98
B 78 89
C 44 433

[root@redis-server1 ~]# for i in `cat a.txt|awk -F" " '{print $1}'|sort|uniq`;do cat a.txt|grep $i|xargs;done|awk -F" " '{print $1":",$2":",$4}'
A: 88: 98
B: 78: 89
C: 44: 433

第二种方法:
[root@redis-server1 ~]# awk '{a[$1]=a[$1]" "$2}END{for(i in a)print i,a[i]}' a.txt |awk '{print $1":",$2";",$3}'
A: 88; 98
B: 78; 89
C: 44; 433

示例二                                                  
[root@redis-server1 ~]# cat b.txt
123 444
23 888
455 45
55 367
66 100
77 89

对上面b.txt文件里的两列数字分别求和,求平均值
[root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a,b}' b.txt
799 1933
[root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a":",b}' b.txt
799: 1933
[root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a":"b}' b.txt
799:1933

[root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a/NR,b/NR}' b.txt
133.167 322.167
[root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a/NR":",b/NR}' b.txt
133.167: 322.167
[root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a/NR":"b/NR}' b.txt
133.167:322.167

                                 使用awk排除第一行和第二行的数据                                 

如查看本机所有进程cpu的百分比总和
[root@kevin ~]# ps auxw|awk '{print $3}'
%CPU
0.0
0.0
0.0
0.0
....
1.2
0.0
0.0 [root@kevin ~]# ps auxw|awk '{print $3}'|wc -l
145 由于第一行有"%CPU",所以需要将结果中的第一行字符去掉
[root@kevin ~]# ps auxw|awk '{if (NR>1){print $4}}'
.....
0.0
0.0
0.0
0.0
....
1.2
0.0
0.0 [root@kevin ~]# ps auxw|awk '{if (NR>1){print $4}}'|wc -l
144 如果是去掉结果中的第一行,第二行和第三行,则只需要"NR>3"即可
[root@kevin ~]# ps auxw|awk '{if (NR>2){print $4}}'

                                                示例:条件判断                                            

[root@master-node ~]# cat aa.txt
123 root
345 wangshibo
456 opt
789 nginx
100 wangshibo
200 huanqiu
300 hqtime 打印aa.txt文件中第二列包含wang字符的内容
[root@master-node ~]# awk '$2~/wang/ {print $0}' aa.txt
345 wangshibo
100 wangshibo 打印aa.txt文件中第二列不包含wang字符的内容
[root@master-node ~]# awk '$2 !~/wang/ {print $0}' aa.txt
123 root
456 opt
789 nginx
200 huanqiu
300 hqtime 打印aa.txt文件中第二列以wang字符开头的内容
[root@master-node ~]# awk '$2~/^wang/ {print $0}' aa.txt
345 wangshibo
100 wangshibo 打印aa.txt文件中第二列以bo字符结尾的内容
[root@master-node ~]# awk '$2~/bo$/ {print $0}' aa.txt
345 wangshibo
100 wangshibo 打印aa.txt文件中第二列是wangshibo的内容(精确匹配)
[root@master-node ~]# awk '$2=="wangshibo" {print $0}' aa.txt
345 wangshibo
100 wangshibo 打印aa.txt文件中第二列不是wangshibo的内容
[root@master-node ~]# awk '$2!="wangshibo" {print $0}' aa.txt
123 root
456 opt
789 nginx
200 huanqiu
300 hqtime 打印aa.txt文件中第一列数字大于500的内容
[root@master-node ~]# awk '$1>500 {print $0}' aa.txt
789 nginx 打印aa.txt文件中第一列数字大于500且第二列是wangshibo的内容
[root@master-node ~]# awk '$1<200 && $2=="wangshibo" {print $0}' aa.txt
100 wangshibo 打印aa.txt文件中第一列数字大于500或是第二列是wangshibo的内容
[root@master-node ~]# awk '$1<200 || $2=="wangshibo" {print $0}' aa.txt
123 root
345 wangshibo
100 wangshibo

                     示例:输入几个数,自动计算出最大值,最小值,总和                         

[root@test2 ~]# cat test1.sh
#!/bin/bash
#任意输入5个数,判断最大值,最小值,总和 s=0
read -p "please input:" num s=$(($s+$num))
max=$num
min=$num
for i in `seq 4`
do
read -p "please input:" num
s=$(($s+$num)) if [ $num -le $min ];then
min=$num
fi if [ $num -ge $max ];then
max=$num
fi done
echo sum:$s max:$max min:$min [root@test2 ~]# /bin/bash test1.sh
please input:12
please input:13
please input:14
please input:15
please input:16
sum:70 max:16 min:12 ================================================================================= [root@test2 ~]# cat test2.sh
#!/bin/bash
#任意输入3个数,判断最大值,最小值,总和 s=0
n=0
for i in `seq 3`
do
read -p "please input:" num
expr ${num} + 0 1>/dev/null 2>&1
if [ $? -eq 0 ];then
echo "${num} is a number!"
else
echo "${num} is not a number!"
exit
fi s=$(($s+$num))
[ $n -eq 0 ] && max=$num && min=$num
n=$(($n+1)) if [ $num -le $min ];then
min=$num
fi if [ $num -ge $max ];then
max=$num
fi done
echo sum:$s max:$max min:$min n:$n [root@test2 ~]# /bin/bash test2.sh
please input:123
123 is a number!
please input:567
567 is a number!
please input:512
512 is a number!
sum:1202 max:567 min:123 n:3

Linux下的计算命令和求和、求平均值、求最值命令梳理的更多相关文章

  1. Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50

    Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50 分类: 系统运维 查找包含BOM头的文件,命令如下: 点击(此处)折叠或打开 grep -r -I -l ...

  2. [转帖]linux下查找文件及查找包含指定内容的文件常用命令。

    linux下查找文件及查找包含指定内容的文件常用命令. https://blog.csdn.net/yangyu19910407/article/details/18266821 最简单的查找 fin ...

  3. AWK求和、平均值、最值

    --AWK求和.平均值.最值------------------------2014/02/14  打包当前目录下的所有文件 ls | awk '{ print "tar zcvf &quo ...

  4. linux下创建可引导的U盘系统,使用dd命令进行Linux的ghost

    1,通过iso创建可引导的U盘系统. 1.0,格式化U盘为FAT32格式 linux下能够使用命令: mkfs.vfat U盘的设备路径 比如: mkfs.vfat /dev/sdb 当中U盘的路径能 ...

  5. linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录

    最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登 录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都 ...

  6. linux下查找包含BOM头的文件和清除BOM头命令

    查找包含BOM头的文件,命令如下:   grep -r -I -l $'^\xEF\xBB\xBF' ./   这条命令会查找当前目录及子目录下所有包含BOM头的文件,并把文件名在屏幕上输出.   但 ...

  7. linux下redis4.0.2集群部署(利用Ruby脚本命令)

    一.原生命令方式和Ruby脚本方式区别 利用Ruby脚本部署和用原生命令部署,节点准备的步骤都是一样的,节点启动后的握手,以及主从.槽分配,利用Ruby脚本一步就能完成,利用原生命令需要一步一步地执行 ...

  8. Linux下查找文件:which、whereis、locate、find 命令的区别

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.which       查看可执行文件的位置,通过环境变量查whereis    查看文件的位置,通过数据库查,每 ...

  9. Linux下查看文件和文件夹大小的df和du命令

        转自:http://www.yayu.org/look.php?id=162 当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比 ...

随机推荐

  1. 找Maven --> pom.xml --> groupId和artifactId的网站

    http://mvnrepository.com/ 在此记录

  2. 第五章 绘图基础(LINEDEMO)

    LINEDEMO程序绘制一个矩形.两条直线.一个椭圆和一个圆角矩形.该程序表明,定义了封闭矩形的这些函数确实对这些区域进行了填充,因为椭圆后面的线被隐藏了. /*------------------- ...

  3. Sublime Text 3 注册码激活码被移除的解决办法

    新版的sublime text3中加入了验证功能,之前成功注册的也被移除了,在网上搜索的验证码要么已经失效要么已经被封,少数几个正常的注册输入进去注册成功后几分钟之内这个注册码就会被莫名其妙的被移除. ...

  4. 八皇后问题的Python实现和C#实现

    看到八皇后问题的解决思路, 感觉很喜欢. 我用C#实现的版本之前贴在了百度百科上(https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9 ...

  5. linux命令总结之tr命令

    什么是tr命令?tr,translate的简写,translate的翻译: [trænsˈleit] vi. 翻译, 能被译出 vt. 翻译, 解释, 转化, 转变为, 调动 在这里用到的意思是转化, ...

  6. cf C. Finite or not? 数论

    You are given several queries. Each query consists of three integers pp, qq and bb. You need to answ ...

  7. Android AbsListView Abs前缀

    Android AbsListView Abs abstract:抽象

  8. 崩 oj 1768 最大子矩阵

    描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵.比如,如下4 * 4的矩阵0 -2 -7  0 9  2 -6  2 -4  1 - ...

  9. 动态分析Android程序

    快速定位程序关键点 代码注入法 插入log函数,输出调试信息. const-string v0,"TAG" const-string v1,"info" inv ...

  10. 【Codeforces 3D】Least Cost Bracket Sequence

    Codeforces 3 D 题意:有一个括号序列,其中一些位置是问号,把第\(i\)个问号改成(需要\(a_i\)的代价,把它改成)需要\(b_i\)的代价. 问使得这个括号序列成立所需要的最小代价 ...