求和、平均值、最值
[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 1 2 3 4 5 6 #!/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” “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
paste 命令将多个文件合并
[root@redis-server1 ~]# cat aa.txt 11 22 33 44 55 [root@redis-server1 ~]# cat bb.txt aa ab ac cc cd [root@redis-server1 ~]# paste aa.txt bb.txt 11 aa 22 ab 33 ac 44 cc 55 cd [root@redis-server1 ~]# paste -d":" aa.txt bb.txt 11:aa 22:ab 33:ac 44:cc 55:cd [root@redis-server1 ~]# paste -d"-" aa.txt bb.txt 11-aa 22-ab 33-ac 44-cc 55-cd
使用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
文章来源: https://blog.csdn.net/Nikki0126/article/details/90714363