大家好,又见面了,我是你们的朋友全栈君。
一.数组基本概述
1.什么是数组 数组其实也算是变量, 传统的变量只能存储一个值, 但数组可以存储多个值。
2.数组的分类 shell数组分为普通数组和关联数组 普通数组:只能使用整数 作为数组索引 关联数组:可以使用字符串 作为数组索引
二.数组基本使用
1.普通数组仅能使用整数来作为索引
(1).普通数组的赋值
#方式一, 针对每个索引进行赋值(数组名[索引]=变量值)
代码语言:javascript复制[root@manager /tmp/sh/awk]# array1[0]=pear
[root@manager /tmp/sh/awk]# array1[1]=apple
[root@manager /tmp/sh/awk]# array1[2]=orange
#方式二, 一次赋多个值 ( 数组名=(多个变量值) )
代码语言:javascript复制[root@manager /tmp/sh/awk]# array2=(tom jack alice)
[root@manager /tmp/sh/awk]# array3=(tom jack alice "bash shell")
(2).如何查看普通数组的赋值与访问数组的内容
#方式一,查看所有数组
代码语言:javascript复制[root@manager /tmp/sh/awk]# declare -a
declare -a array1='([0]="pear" [1]="apple" [2]="orange")'
declare -a array2='([0]="tom" [1]="jack" [2]="alice")'
declare -a array3='([0]="tom" [1]="jack" [2]="alice" [3]="bash shell")'
#方式二,查看某数组的所有值(echo ${array1 [ @ | * ] )
代码语言:javascript复制[root@manager /tmp/sh/awk]# echo ${
array1[@]}
pear apple orange
#方式三,查看某数组某索引对应的数组值
代码语言:javascript复制[root@manager /tmp/sh/awk]# echo ${
array1[0]} #数组名加索引即可访问数组中的元素
pear
#方式四,查看某数组的所有索引
代码语言:javascript复制[root@manager /tmp/sh/awk]# echo ${
!array1[@]}
0 1 2
2.关联数组能使用字符串的方式作为索引
(1).关联数组的赋值
#1.必须先申明这是一个关联数组
代码语言:javascript复制[root@manager /tmp/sh/awk]# declare -A info
[root@manager /tmp/sh/awk]# declare -A info2
#2.方式一, 关联数组的赋值 (数组名[索引]=变量值 )
代码语言:javascript复制[root@manager /tmp/sh/awk]# info[index1]=pear
[root@manager /tmp/sh/awk]# info[index2]=apple
[root@manager /tmp/sh/awk]# info[index3]=orange
#3.方式二, 关联数组的赋值 (数组名=([索引1]=变量值2 [索引2]=变量值2) )
代码语言:javascript复制[root@manager /tmp/sh/awk]# info2=([index1]=linux [index2]=nginx [index3]=docker [index4]='bash shell')
#4.查看关联数组
代码语言:javascript复制[root@manager /tmp/sh/awk]# declare -A
2.如何访问关联数组中的数据
代码语言:javascript复制[root@manager /tmp/sh/awk]# echo ${
info2[index2]} #访问数组中的第二个元数
nginx
[root@manager /tmp/sh/awk]# echo ${
info2[@]} #访问数组中所有元数 等同于 echo ${
info2[*]}
bash shell linux nginx docker
[root@manager /tmp/sh/awk]# echo ${
!tt_array2[@]} #访问数组中所有元数的索引
index4 index1 index2 index3
三.在sehll中使用数组,统计文件信息
1.普通数组赋值与遍历示例
代码语言:javascript复制while read line
do
# i从0开始自增,索引0对应文件内容第一行,往后依次对应
hosts[i ]=$line
done</etc/hosts
# 遍历
# 取反得出所有索引,以此为循环
for i in ${
!hosts[@]}
do
# 输出所有索引,并打印索引对应的值
echo "hosts数组的索引: $i , 索引对应的值: ${hosts[$i]}"
done
2.使用关联数组统计文件中的男女性别
代码语言:javascript复制#1.准备对应的文件
[root@manager /tmp/sh/awk]# cat sex.txt
jack m
alice f
tom m
rose f
robin m
bgx m
[root@manager /tmp/sh/awk]# cat count_sex.sh
#!/usr/bin/bash
declare -A sex
#1.对数组进行赋值
while read line
do
type=$(echo $line|awk '{print $2}') #2.取出第二列的内容
let sex[$type] #3.定义一个关联数组,让数组的值不断自增
done< sex.txt
#4.遍历数组
for i in ${
!sex[@]}
do
echo "$i ${sex[$i]}"
done
3.数组值的自增演示
代码语言:javascript复制[root@manager /tmp/sh/2020-12-09_题]# declare -A ip #声明一个数组 ip
[root@manager /tmp/sh/2020-12-09_题]# echo ${
ip[aa]} #输出索引为aa的ip数组的初始值,显示为空,其实为0
[root@manager /tmp/sh/2020-12-09_题]# let ip[aa] #让索引为aa的ip数组值自增
[root@manager /tmp/sh/2020-12-09_题]# echo ${
ip[aa]} #再输出,可以看到,其值变为1
1
[root@manager /tmp/sh/2020-12-09_题]# let ip[aa]
[root@manager /tmp/sh/2020-12-09_题]# echo ${
ip[aa]}
2
[root@manager /tmp/sh/2020-12-09_题]# let ip[aa]
[root@manager /tmp/sh/2020-12-09_题]# echo ${
ip[aa]}
3
4.统计用户的shell
代码语言:javascript复制#!/bin/bash
# **********************************************************
# * Author : oldwang
# * Email : lilulilu6666@163.com
# * Create time : 2020-12-09 17:26
# * Filename : 01.sh
# * Description : lueluelue
# **********************************************************
#声明一个数组shells
declare -A shells
#遍历文件/etc/passwd中的值
while read line
do
#截取最后一列,即用户的shell
types=$(echo $line | awk -F ':' '{print $NF}')
#以shell作为索引,让每个shell对应的值自增
let shells[$types]
done</etc/passwd
#${
!shells[@]},得到所有的索引值,即为所有的shell类型
for i in ${
!shells[@]}
do
#输出:shell类型,出现次数
echo "索引是: $i , 索引出现的次数: ${shells[$i]}"
done
四.awk数组
1.对nginx的访问日志进信息统计,rul的访问次数前十名,并统计访问大小
代码语言:javascript复制[root@manager /tmp/sh/awk]# cat access.awk
{
#次数
ngx_url_count[$7]
#大小
ngx_url_size[$7] =$10
}
END{
for ( i in ngx_url_count ) {
print ngx_url_count[i],i,ngx_url_size[i]/1024"kb"
}
}
[root@manager /tmp/sh/awk]# awk -f access.awk access.log | sort -nr | head
4733 / 2602.81kb
746 /course/ajaxmediauser/ 42.998kb
467 /course/ajaxmediauser 26.1494kb
307 /socket.io/1/ 27.6963kb
132 /u/card 44.0996kb
109 /favicon.ico 156.215kb
103 /api3/savemediafinish 10.665kb
96 /api3/getinvitemeuserlist 11.8184kb
94 /api3/latest 61.3027kb
93 /u/loading 5.99512kb
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161657.html原文链接:https://javaforall.cn