数学运算数组文本处理
Posted qluzzh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学运算数组文本处理相关的知识,希望对你有一定的参考价值。
数学运算、数组、文本处理
数学运算
数组的使用
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 ))
- ==、>、<、!=、<=、>=
[[email protected] ~]# (( 10+2 > 10-2 )) && echo ok || echo no
ok
[[email protected] ~]# a=10
[[email protected] ~]# ((a>20)) && echo ok || echo no
no
[[email protected] ~]# ((a<20)) && echo ok || echo no ///变量加不加$都可以
ok
[[email protected] ~]# ((a==20)) && echo ok || echo no ///注意这里是两个=,一个=是赋值
no
[[email protected] ~]# ((a!=20)) && echo ok || echo no ///不等于只能用一个=
ok
小数运算
bash只支持整数的运算, 浮点数运算用bc
[[email protected] ~]# 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地址存入数组中
[[email protected] ~]# ip=( 192.168.0.1 192.168.0.2 192.168.0.3 )
[[email protected] ~]# echo ${ip[0]}
192.168.0.1
[[email protected] ~]# echo ${ip[1]}
192.168.0.2
[[email protected] ~]# echo ${ip[2]}
192.168.0.3
[[email protected] ~]# ip[3]=192.168.0.4
[[email protected] ~]# echo ${ip[3]}
192.168.0.4
查看数组里面的元素个数
[[email protected] ~]# echo ${#ip[@]} // 查看数组元素个数
4
[[email protected] ~]# echo ${ip[@]} // 查看数组所有元素
192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4
[[email protected] ~]# echo ${!ip[@]} // 查看查看数组下标
0 1 2 3
[[email protected] ~]# unset ip[1] // 清除数组中某个元素
[[email protected] ~]# echo ${!ip[@]}
0 2 3
[[email protected] ~]# unset ip // 清除整个数组
利用数组获取当前主机的默认网关
[[email protected] ~]# vi gate.sh
#!/bin/bash
a=($(route -n | grep ‘^0.0.0.0‘))
echo gateway is ${a[1]}
[[email protected] ~]# bash gate.sh
gateway is 10.10.10.254
将变量替换为数组
[[email protected] ~]# var1="aaa bbb ccc"
[[email protected] ~]# var2=($var1)
利用循环为数组赋值
[[email protected] ~]# vi gate.sh
#!/bin/bash
for i in tom jerry lee mike
do
names[x++]=$i;
done
echo ${names[@]} [[email protected] ~]# vi gate.sh
#!/bin/bash
for i in tom jerry lee mike
do
names[x++]=$i;
done
echo ${names[@]}
关联数组
下标是指定的字符串,下标无序
数组bash 4.0开始支持关联数组,RHEL5不支持
[[email protected] ~]# declare -A name
[[email protected] ~]# name=([user]=txy [pwd]=123 [age]=18)
[[email protected] ~]# echo ${name[@]}
123 txy 18
[[email protected] ~]# echo ${#name[@]}
3
[[email protected] ~]# echo ${!name[@]}
pwd user age
[[email protected] ~]# echo ${name[user]}
txy
seq命令打印数字串
seq
用途:打印出一串有序的数字
格式:seq [选项] 数字范围
-s:指定分隔符
-w:指定同等宽带输出
[[email protected] ~]# seq -s " " 90 100
90 91 92 93 94 95 96 97 98 99 100
[[email protected] ~]# seq -s "**" 90 100
90**91**92**93**94**95**96**97**98**99**100
[[email protected] ~]# 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 ‘:‘ ‘
‘
使用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 ‘ ‘ ‘
’
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个位置参数指定目录的绝对路径
以上是关于数学运算数组文本处理的主要内容,如果未能解决你的问题,请参考以下文章
错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”