数学运算、数组、文本处理

数学运算、数组、文本处理
数学运算
数组的使用
seq 、tr 、sort、uniq、cut等命令
整数运算
常用运算符
    • 加法运算:+
    • 减法运算: -
    • 乘法运算: *
    • 除法运算: /
    • 求模(取余)运算: %
    • 求幂运算:**
常用整数运算
第一种
declare -i a=10*20;echo $a 少用
第二种
a=$(expr 10 '*' 20);echo $a 少用
第三种
a=$[10*2]; echo $a []中的变量无需加$
echo $[ RANDOM % 10 ],求0-9的随机数
第四种
a=$((10*20));echo $a $(())中的变量无需加$
echo $(( RANDOM % 10 )) 求0-9的随机数
第五种 (推荐)
((a=10*20));echo $a 常用来赋值
((a++)) (())中的变量无需加$
((a+=10))
第六种
let a=10*20;echo $a 常用来赋值
let i++
let i+=10
条件测试操作
双圆括号整数值比较(推荐方法)
  • 格式(( 整数1 操作符 整数2 ))
  • ==、>、<、!=、<=、>=
[root@localhost ~]# (( 10+2 > 10-2 )) && echo ok || echo no
ok
[root@localhost ~]# a=10
[root@localhost ~]# ((a>20)) && echo ok || echo no 
no
[root@localhost ~]# ((a<20)) && echo ok || echo no        ///变量加不加$都可以
ok
[root@localhost ~]# ((a==20)) && echo ok || echo no       ///注意这里是两个=,一个=是赋值
no
[root@localhost ~]# ((a!=20)) && echo ok || echo no     ///不等于只能用一个=
ok
小数运算
bash只支持整数的运算, 浮点数运算用bc
[root@localhost ~]# echo "5*6.3" | bc
31.5
数组的基本用法
数组(Array)是一个由若干同类型变量组成的集合,引用这些变量时可用同一名字。数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素
bash Shell只支持一维数组,数组从0开始标号,以array[x]表示数组元素,那么,array[0]就表示array数组的第1个元素、array[1]表示array数组的第2个元素、array[x]表示array数组的第x+1个元素
索引数组
下标是>=0的整数,默认从0开始
下标有序,不一定连续
声明数组
格式:数组名=(参数1 参数2 ….)
多个ip地址存入数组中
[root@localhost ~]# ip=( 192.168.0.1 192.168.0.2 192.168.0.3 )
[root@localhost ~]# echo ${ip[0]}
192.168.0.1
[root@localhost ~]# echo ${ip[1]}
192.168.0.2
[root@localhost ~]# echo ${ip[2]}
192.168.0.3
[root@localhost ~]# ip[3]=192.168.0.4
[root@localhost ~]# echo ${ip[3]}
192.168.0.4
查看数组里面的元素个数
[root@localhost ~]# echo ${#ip[@]}              // 查看数组元素个数
4
[root@localhost ~]# echo ${ip[@]}                 //  查看数组所有元素
192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4
[root@localhost ~]# echo ${!ip[@]}                 // 查看查看数组下标
0 1 2 3
[root@localhost ~]# unset ip[1]                   //    清除数组中某个元素
[root@localhost ~]# echo ${!ip[@]}
0 2 3
[root@localhost ~]# unset ip                      //  清除整个数组
利用数组获取当前主机的默认网关
[root@localhost ~]# vi gate.sh
#!/bin/bash
a=($(route -n | grep '^0.0.0.0'))
echo gateway is ${a[1]}
[root@localhost ~]# bash gate.sh
gateway is 10.10.10.254
将变量替换为数组
[root@localhost ~]# var1="aaa bbb ccc"
[root@localhost ~]# var2=($var1)
利用循环为数组赋值
[root@localhost ~]# vi gate.sh
#!/bin/bash
for i in tom jerry lee mike
do
    names[x++]=$i;
done
echo ${names[@]} [root@localhost ~]# vi gate.sh
#!/bin/bash
for i in tom jerry lee mike
do
    names[x++]=$i;
done
echo ${names[@]} 
关联数组
下标是指定的字符串,下标无序
数组bash 4.0开始支持关联数组,RHEL5不支持
[root@localhost ~]# declare -A name
[root@localhost ~]# name=([user]=txy [pwd]=123 [age]=18)
[root@localhost ~]# echo ${name[@]}
123 txy 18
[root@localhost ~]# echo ${#name[@]}
3
[root@localhost ~]# echo ${!name[@]}
pwd user age
[root@localhost ~]# echo ${name[user]}
txy
seq命令打印数字串
seq
用途:打印出一串有序的数字
格式:seq [选项] 数字范围
-s:指定分隔符
-w:指定同等宽带输出
[root@localhost ~]# seq -s " " 90 100
90 91 92 93 94 95 96 97 98 99 100
[root@localhost ~]# seq -s "**" 90 100
90**91**92**93**94**95**96**97**98**99**100
[root@localhost ~]# seq -s "**" -w 90 100
090**091**092**093**094**095**096**097**098**099**100

tr命令字符转换
tr命令
字符转换工具
只能对stdin操作,不能直接对文件操作
使用tr转换字符
tr SET1 SET2
用SET2中的字符替换掉SET1中同一位置的字符
echo 123456 | tr 345 abc
tr 123 abc < aa
tr ‘[a-z]’ ‘[A-Z]’ < /etc/hosts
echo $PATH | tr ':' '\n'
使用tr删除字符
tr -d SET
将stdin中数据流删除与SET相同的字符
echo 123456 | tr -d 345
tr -d '[0-9]’ < /etc/hosts
df -h | tr -d %
who | tr -d ' '
使用tr压缩字符
tr -s SET
将连续相同的字符压缩成一个字符
echo 112233444555666 | tr -s 345
ifconfig | tr -s ' '
tr -s SET1 SET2
先替换为SET2再压缩
echo 112233444555666 | tr -s 345 abc
echo 112233444555666 | tr 345 abc | tr -s abc
who | tr -s ‘ ‘ ‘\n’
sort命令
sort命令
默认按每行的第一个字符排序
-n:按整数进行排序
-r:递减排序
指定排序键
指定按哪一列数据进行排序
-k:指定哪一列为排序键
cat tt | sort -n -k4
指定字段分隔符
-t:指定字段分割符(默认是空白)
sort -t: -n -k3 /etc/passwd
uniq命令
uniq命令
删除经过排序后的数据的重复记录
通常和sort连用
sort -n tt | uniq
数据的实例统计
-c:统计特定记录出现的次数
cat tt | uniq -c
-u:只显示唯一的行
cat tt | uniq –u
-d:只显示重复的行
cat tt | uniq -d
数据提取
cut命令
从文本文件或者文本流中提取文本列
cut -选项 提取范围 文本文件
常见选项
-c:从指定提取范围中提取字符
-f:从指定提取范围中提取字段
提取范围
n:第n项
n-:第n项到行尾
-m:行首到第m项
n,m:第n项和第m项
n-m:第n项到第m项
cut -c命令
ls -l | cut -c10
who | cut -c 20-40
cut -c -10 /etc/passwd
cut -f命令
-d:指定分隔符默认是Tab
cut -d “:” -f 1,7 /etc/passwd
who | cut -d ' ' -f1,6
案例
实验案例1
脚本提示输入任意的数字,然后显示如下结果
实验案例2
脚本接受输入两个整数,然后自动显示显示结果如下
实验案例3
脚本实现显示现在离放学还有多少时间,放学时间是17:30,显示效果如下
实验案例4
利用数组实现从文件中随机挑选姓名的脚本
有一个包含姓名的文件,姓名之间用空格隔开
显示效果如下
脚本示例
编写脚本创建用户,要求根据输入的用户名前缀和数目自动创建
实验案例5
利用数组和seq命令实现双色球彩票脚本
32个红球中随机选6个,16个蓝球中随机选1个
建议使用for循环
显示效果如下
实验案例6
命令练习
只显示/boot目录下所有对象的实际空间,并按由小到大排序
统计/etc/passwd中每种shell的被使用次数
用parted命令只显示出分区和文件系统的类型
统计/etc/passwd文件中sbin这个单词出现多少次
只显示网卡eth0的IP地址
实验案例7
编写脚本统计/var/log/secure文件中ssh访问密码错误的用户次数(包括不存在的用户)和IP次数,要从大到小排序,显示效果参考如下
实验案例8
编写脚本统计指定目录下面文件占用空间大小超过10M的文件的数目和大小总和
使用1个位置参数指定目录的绝对路径

 

posted @ 2019-01-22 21:42  DBA_zzher  阅读(228)  评论(0编辑  收藏  举报