第二章 数学运算、数组、文字处理

第二章 数学运算、数组、文字处理.md

知识要点

  • 数学运算
  • 数组的使用
  • seq tr sort uniq cut 等命令

数学运算

整数运算

常用的运算符

  • 加法运算符:+
  • 减法运算符:-
  • 乘法运算符:/
  • 求模运算符:%
  • 求幂运算符:**

常用整数运算

  1. 第一种
  2. declare -i a=10*20; echo $a 少用
  3. 第二种
  4. a=$(expr 10‘*‘20); echo $a 少用
  5. 第三种
  6. a=$[10*2]; echo $a []中的变量无需加$
  7. echo $[RANDOM%10] 求0-9的随机数
  8. 第四种
  9. a=$((10*20)); echo $a $(())中的变量无需加$
  10. echo $((RANDOM%10)) 求0-9的随机数
  11. 第五种(推荐)
  12. ((a=10*20)); echo $a 常用来赋值
  13. ((a++)) (())中的变量无需加$
  14. 第六种
  15. let a=10*20; ehco $a 常用来赋值
  16. let i++
  17. let i+=10

条件测试

双圆括号整数值比较(推荐方法)

格式((整数1 操作符 整数2))

操作符: ==, >, < , != , <= , >=

小数运算

注意bash只支持整数的运算,浮点数的运算用bc。

例如

  1. # echo 4/3 | bc
  2. 1
  3. # echo "scale=2;4/3"/bc
  4. 1.33

案例1

案例2

案例3

脚本实现显示现在离放学还有多长时间,放学时间是17:30,显示效果如下

数组的基本用法

数组是一个由若干同类型变量组成的集合,引用这些变量时可以使用同一个名字。数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素

bash shell只是支持一维数组,数组从0开始标号,以array[x]表示数组元素,那么,array[0]就表示array数组的第一个元素,array[1]表示array数组的第二个元素,array[x]表示array数组的第x+1个元素。

声明数组

格式:数组名=(参数1 参数2 …)

多个ip地址存入数组中

  1. [[email protected] ~]# ip=( 192.168.0.1 192.168.0.2 192.168.0.3 )
  2. [[email protected] ~]# echo ${ip[0]}
  3. 192.168.0.1
  4. [[email protected] ~]# echo ${ip[1]}
  5. 192.168.0.2
  6. [[email protected] ~]# echo ${ip[2]}
  7. 192.168.0.3
  8. [[email protected] ~]# ip[3]=192.168.0.4
  9. [[email protected] ~]# echo ${ip[3]}
  10. 192.168.0.4

数组的基本用法

查看数组里面的元素个数

echo {#ip[@]} 查看数组元素个数  
echo{ip[@]} 查看数组所有元素

echo ${!ip[@]} 查看数组下标

unset ip[1] 清除数组中的某个元素

unset ip 清除整个数组。

利用数组获得当前主机的网关

  1. [[email protected] ~]# vi gate.sh
  2. #!/bin/bash
  3. a=($(route -n | grep ‘^0.0.0.0‘))
  4. echo gateway is ${a[1]}
  5. [[email protected] ~]# bash gate.sh
  6. gateway is 10.10.10.254

将变量替换为数组

  1. [[email protected] ~]# var1="aaa bbb ccc"
  2. [[email protected] ~]# var2=($var1)

关联数组

数组bash 4.0开始支持关联数组,rhel5不支持

  1. [[email protected] ~]# declare -A name
  2. [[email protected] ~]# name=([user]=txy [pwd]=123 [age]=18)
  3. [[email protected] ~]# echo ${name[@]}
  4. 123 txy 18
  5. [[email protected] ~]# echo ${#name[@]}
  6. 3
  7. [[email protected] ~]# echo ${!name[@]}
  8. pwd user age
  9. [[email protected] ~]# echo ${name[user]}
  10. txy

案例4

利用数组从文件中随机挑选姓名的脚本

有一个包含姓名的文件,姓名用空格隔开

seq命令

seq

用途:打印出一串有序的数字

格式:seq [选项] 数字范围

-s:指定分隔符

-w:指定同等宽带输出

  1. [[email protected] ~]# seq -s " " 90 100
  2. 90 91 92 93 94 95 96 97 98 99 100
  3. [[email protected] ~]# seq -s "**" 90 100
  4. 90**91**92**93**94**95**96**97**98**99**100
  5. [[email protected] ~]# seq -s "**" -w 90 100
  6. 090**091**092**093**094**095**096**097**098**099**100
  7. 6

脚本实例

编写脚本创建用户,要求根据输入的用户名前缀和数目自动创建

  1. #!/bin/bash
  2. read -p "please input username prefix: " USER
  3. read -p "the number of new users: " NUM
  4. for i in $(seq -w $NUM)
  5. #for i in {01..$NUM}
  6. do
  7. useradd $USER$i && echo "$USER$i has been created"
  8. done
  9. }

实验案例5(没有意义所以不写)

利用数组和seq命令实现双色球彩票脚本

32个红球中随机选6个,16个篮球中随机选1个

建议使用for循环

tr命令

tr字符转换工具

只能对stdin操作,不能直接对文件操作

使用tr转换字符

tr set1 set2

使用set2中的字符替换掉set1中同一位置的字符

  1. pecho 123456 | tr 345 abc
  2. ptr 123 abc < aa
  3. ptr ‘[a-z]’ ‘[A-Z]’ < /etc/hosts
  4. pecho $PATH | tr ‘:‘ ‘\n‘

使用tr删除字符

tr -d set

将stdin中数据流删除与set相同的字符

  1. pecho 123456 | tr -d 345
  2. ptr -d ‘[0-9]’ < /etc/hosts
  3. p df -h | tr -d %
  4. pwho | tr -d ‘ ‘

使用tr压缩字符

tr -s set

将连续相同的字符压缩成一个字符

pecho 112233444555666 | tr -s 345

pifconfig | tr -s ‘ ‘

tr -s set1 set2

先将set1 替换成set2 再压缩

pecho 112233444555666 | tr -s 345 abc

pecho 112233444555666 | tr 345 abc | tr -s abc

pwho | tr -s ‘ ‘ ‘\n’

sort命令

sort 命令

默认按每行的第一个字符排序

-n:按整数进行排序

-r:递减排序

指定排序键

指定按哪一列数据进行排序

-k:指定哪一列为排序键

cat tt | sort -n -k4

指定字段分隔符

-t:指定字段分隔符(默认是空白)

sort -t : -n -k3 /etc/passwd

uniq

删除经过排序后的数据的重复记录

通常和sort连用

sort -n tt | uniq

数据的实例统计

-c:统计特定记录出现的次数

cat tt| uniq -c

-u:只显示唯一的行

cat tt | uniq -u

-d:只显示重复的行

cat tt | uniq -d

数据提取cut

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

实验案例6

命令练习

只显示/boot目录下所有对象的实际空间,并按由小到大排序

统计/etc/passwd中每种shell的被使用次数

用fdisk -l命令只显示出分区和文件系统的类型

统计/etc/passwd文件中sbin这个单词出现多少次

只显示网卡eth0的IP地址

实验案例7

编写脚本统计/var/log/secure文件中ssh访问密码错误的用户次数(包括不存在的用户)和IP次数,要从小到大排序,显示效果参考如下

实验案例8

编写脚本统计指定目录下面文件占用空间大小超过10M的文件的数目和大小总和

使用1个位置参数指定目录的绝对路径

实验案例9

有一个FTP的日志文件xferlog(服务器上下载),要求根据下列的要求对这个日志文件进行处理

统计每个ip下载的文件的总大小,要显示出总大小大于2M的IP和总大小,按降序显示(以MB为单位)

时间: 2024-08-06 02:38:06

第二章 数学运算、数组、文字处理的相关文章

JAVA-初步认识-第二章-类型运算细节

一. 深入探究变量在不同过程中背后隐藏的原理 变量在程序中参与了两种过程,定义和计算.我们举一些例子,来说明背后的原理.(除了数值型的变量外,其它类型的也可以是变量,只要一直在变动的就是变量.) 在变量的定义过程中,byte b=4; 书写出来的4默认的是int类型,将其赋值给byte类型,在DOS中,应该报错为精度缺失.但是DOS并没有报错,反而运行的很正常.原理就是:在赋值的过程中,计算机会进行判断,赋的值是否在所规定的类型范围之内.在这里4是在-128~127的范围里的,只要在这里范围里,

计算机组成原理(科学出版社) 第二章:运算方法和运算器

复习 20190630 一. 原码.补码.反码.移码 真值(十进制数) 转换为真值(二进制数)最好补全为八位,对应的原码就是将最高位写成符号位(还是八位) 具体思维导图如下: 原码求补码的简便方法:除符号位之外,从最低位开始,遇第一个1之前的各位保持不变,其余各位按位取反 进制之间的转换,思维导图如下: 二.补码加减法 补码加法公式:[X]补 + [Y]补 = [X+Y]补    (mod  2n+1) 定理:任意两数补码之和等于该两数之和的补码 2.  补码的乘法和除法就是将[X]的补码向左或

python基础第二章:运算与运算符

运算与运算符 运算分类:算术运算,比较运算,赋值运算,逻辑运算,位运算,成员检测,身份运算 算术运算:+   -  *  /  (除,返回的一定是整型) **(幂) //(取商,返回的不一定是整型) %(取余) 比较运算:>  <  <=  >=  ==  !=(不等于) 赋值运算:=  +=   -=  /=  *=   **=  //=   %= 逻辑运算:not    and   or 位运算:二进制(0b) bin 八进制(0o) oct 十六进制(0x)hex R进制转十

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

数学运算 数组的使用 seq .tr .sort.uniq.cut等命令

JAVA-初步认识-第二章-字符类型的运算

一. 第二章知识点脉络分析 第二章的题目就叫<JAVA语言基础>,先介绍了JAVA语言中,常见的基础知识点名词:关键字,标识符,注释,常量和变量,函数和数组.到目前为止,还没有完全学完.在现有的学习过程中,我们做一个知识点脉络分析. 前三个基础知识点,关键字,标识符和注释,只是介绍了书写的规则.后面的常量和变量是一个重点,而函数和数组压根就没有进行介绍.在常量和变量这个重点知识点中,无论是常量还是变量都是数据,从而我们在定义和使用变量时,会涉及不同类型的数据,这就需要我们对数据的类型进行仔细地

《数学之美》——第二章 个人笔记

第二章    自然语言处理--从规则到统计 这一章开头这句话:字母,文字,数字是信息编码的不同单位.任何一种语言都是一种编码的方式,而语言的语法规则是编解码的算法.我们表达一个意思要通过语言表达出来,就是用这种语言的编码方式表示出来,结果就输出一串文字.别人懂这门语言的编码方式,就会理解.这里说的输出一串文字,可以是字母,数字(计算机理解),和开头说的信息编码的不同单位是符合的,就很好理解了.这就是语言的数学本质. ?①计算机能处理自然语言 ?②它处理自然语言的方法和人类一样 1 机器智能 有意

shell脚本数组的数学运算

今天在用shell脚本写斐波那契数列计算时,一直不停的报错,主要原因是因为shell脚本实在太不智能,在进行数组运算时需要写大量的符号,很容易混淆,所以稍微总结一下数组元素的计算. 首先,有几种情况: 1 在将一个数学运算结果赋值给某普通变量时: (1) let var=算术表达式 (2) var=$[算术表达式] (3) var=$((算术表达式)) (4) var=$(expr arg1 arg2 arg3 ...) 2 在将一个数学运算结果赋值给某数组元素时: (1)let arr[$i]

数学建模学习笔记(第二章:7个入门建模实例讲解)

第二章:初等模型(初等数学方法建模) 1.    席位分配: a)      问题描述:三个系学生共200名(甲系100.乙系60,丙系40).代表会议共20席,按比例分配,三个系分别为10,6,4席. b)     问题存在:现因学生转系,三系人数分别变为:103,63,34.问20个席位如何分配?才能使得尽量"公平". c)      解决方法:提出不同的假设,进行不同方法的讨论,对不同方法进行对比分析(满足哪些公平条件),得出结论. 2.    双层玻璃窗的功效: a)     

linux学习:特殊符号,数学运算,图像与数组与部分终端命令用法整理

一:特殊符号用法整理 算术比较-eq 等于-ne 不等于-gt 大于-lt 小于-ge 大于或等于-le 小于或等于-a 逻辑与 and &&-o 逻辑或 or ||[ $var -eq 0 ]    #当$var等于0时,返回真[ $var -ne 0 ]    #当$var为非0时,返回真[ $var1 -ne 0 -a $var2 -gt 2 ][ $var1 -ne 0 -o $var2 -gt 2 ] 字符串比较[[ $str1 = $str2 ]]     #当str1等于st