文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

linux shell脚本详解

2023-09-08 07:49

关注

1. 基础

# shell的执行方式:- 路径方式 :必须赋予权限- source  立即执行,不需要权限- bash 执行新建一个文件,扩展名为sh(sh代表shell),输入一些代码:#!/bin/bashecho "Hello World !"#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。运行Shell脚本有两种方法。1.作为可执行程序,将上面的代码保存为test.sh,并 cd 到相应目录:chmod +x ./test.sh  #使脚本具有执行权限./test.sh #执行脚本注意,一定要写成./test.sh,而不是test.sh。2.作为解释器参数,这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:/bin/sh test.sh/bin/php test.php这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。下面的脚本使用 read 命令从 stdin 获取输入并赋值给 PERSON变量,最后在 stdout 上输出:#!/bin/bash echo "What is your name?"read PERSONecho "Hello, $PERSON"运行脚本:chmod +x ./test.sh$./test.sh# 配置只使用名称运行export PATH=/opt/sahre:$PATH    #在PATH中添加目录/opt/shareexport PATH=$PATH:/opt/shareexport设置环境变量是暂时的,只在本次登录中有效,可修改如下文件来使命令长久有效。1. 修改profile文件#vi /etc/profile在里面加入:export PATH="$PATH:/opt/share"这个在我们的机器上是大家共用的,建议不修改这个,只修改自己根路径下的。2. 修改本id根路径下的.bashrc或.bash_profile或$HOME/.profile文件:# vi /home/zhaodw/.bash_profile在里面加入:export PATH="$PATH:/opt/share"source /home/zhaodw/.bash_profile注意:1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量);3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。4、不用export定义的变量只对该shell有效,对子shell也是无效的。

2. test语句

执行条件表达式# 执行条件表达式并显示返回值。[root@pc root]$ test ! "abc" == 123; echo $?0# 等价形式,注意:方括号 [ 后面的空格以及方括号 ] 前面的空格。[root@pc root]$ [ ! "abc" == 123 ]; echo $?0# 支持正则的测试 [[      ]] [root@pc root]$ [[ ! "abc" == 123 ]]; echo $?0

3. shell 语法

算符描述示例
文件比较运算符
-e filename如果 filename 存在,则为真[ -e /var/log/syslog ]
-d filename如果 filename 为目录,则为真[ -d /tmp/mydir ]
-f filename如果 filename 为常规文件,则为真[ -f /usr/bin/grep ]
-L filename如果 filename 为符号链接,则为真[ -L /usr/bin/grep ]
-r filename如果 filename 可读,则为真[ -r /var/log/syslog ]
-w filename如果 filename 可写,则为真[ -w /var/mytmp.txt ]
-x filename如果 filename 可执行,则为真[ -L /usr/bin/grep ]
filename1 -nt filename2如果 filename1 比 filename2 新,则为真[ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2如果 filename1 比 filename2 旧,则为真[ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string如果 string 长度为零,则为真[ -z “$myvar” ]
-n string如果 string 长度非零,则为真[ -n “$myvar” ]
string1 = string2如果 string1 与 string2 相同,则为真[ “$myvar” = “one two three” ]
string1 != string2如果 string1 与 string2 不同,则为真[ “$myvar” != “one two three” ]
算术比较运算符
num1 -eq num2等于[ 3 -eq $mynum ]
num1 -ne num2不等于[ 3 -ne $mynum ]
num1 -lt num2小于[ 3 -lt $mynum ]
num1 -le num2小于或等于[ 3 -le $mynum ]
num1 -gt num2大于[ 3 -gt $mynum ]
num1 -ge num2大于或等于[ 3 -ge $mynum ]
#!/bin/bashtouch hello.txt# 变量类型默认都是字符串类型,无法直接进行数值运算echo "脚本主题: data本身就是复数" >> hello.txtecho "========================= 特殊变量 $n $# $* $@ ========================="echo "$HOME"echo "$SHELL"echo "$USER"# $1 获取第一个参数,$2 获取第二个参数echo "第一个爱妃是 $1, 可谓是倾国倾城"# $# 获取入参个数echo "此次入宫了 $# 个妃子"# $* 代表所有参数,看作整体echo "妃子名单*: $*"# $@ 代表所有参数,区分对待# shellcheck disable=SC2145echo "妃子名单@: $@"# $? 上一次命令的执行状态。0: 正确执行; 非0 : 执行发生错误(具体是哪个数,由命令自己决定)echo " 上一次命令执行状态: $? "echo "========================= 定义变量(随用随注销) ========================="echo "A=1, 等号两边不能有空格"echo "变量名可以由字母、数字和下划线组成,但是不能以数字开头"echo "变量默认都是以字符串类型,无法直接进行数值运算"echo "变量的值如果有空格,需要使用双引号或单引号括起来"Z=1echo "$A的值是: $Z"echo "========================= 运算符 ========================="echo "一共有三种方式,推荐使用$((运算符形式))"echo "  1. $((8 + 8 * 8))"# shellcheck disable=SC2007echo "  2. $[8 + 8 * 8]"# exprecho "  3. expr 8 + 8 * 8"echo "注意: 和声明变量不同,expr运算符间要有空格, 乘号还要转义 /g" abc.txt   # -i 会对源文件进行修改# sed "s/\s*#.*//g" abc.txt   # \s*代表0或多个空格# sed "s/\s*#.*//g; /^$/d" abc.txt # /^$/d删除空行# sed "/a/q" abc.txt # 遇到第一个a就退出# sed -n "/a/p" abc.txt # 打印匹配到a的行# sed "3q" abc.txt # 打印到第三行就退出# sed "3p" abc.txt # 到第三行就打印#sed "/^wo/a cao" abc.txt # a 在匹配行后加一行#sed "/^wo/i ai~" abc.txt  # i 在匹配行前加一行#cmd1="2a mei nv22"#sed "$cmd1" abc.txt#sed "3s/a/TT/g" abc.txt # 只给第三行的a换成了TT#sed "/lai/d" abc.txt#sed "4d;s/wo/ni/g" abc.txt  # ; 号实现多条命令,删除第四行,且替换字符#sed -e "4d" -e "s/wo/ni/g" abc.txt  # ; 号实现多条命令,删除第四行,且替换字符echo "============================== awk ============================="echo "常用函数:tolower():字符转为小写。length():返回字符串长度。substr():返回子字符串。rand():随机数。"echo "一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理"echo "awk [选项参数] 'pattern1{action1} pattern2{action2}...'" fileNameecho "pattern : 表示awk在数据中查找的内容"echo "action  : 在找到所匹配内容时所执行的一系列命令"echo "常用选项参数 -F 指定分隔符"echo "常用选项参数 -v 定义变量, awk的变量是与世隔绝的,里面取不到外面的,外面的也取不到里面的"awk -F ":" '/^root/ {print $7}' demo.txtawk -F ":" '/^root/ {print $1 ", " $7}' demo.txtawk -F ":" '/^root/ {printf("第一列内容是%s, 第7列内容是: %s  ! \n", $1, $7)}' demo.txt# BEGIN 和 ENDawk -F ":" 'BEGIN{print "=== lu ben wei niu bi~ ==="}            /^root/ {printf("第一列内容是%s, 第7列内容是: %s  ! \n", $1, $7)}            END{print "=== bi xv di ! ==="}' demo.txtawk -F ":" 'BEGIN{print "=== lu ben wei niu bi~ ==="}            {printf("第一列内容是%s, 第7列内容是: %s  ! \n", $1, $7)}            END{print "=== bi xv di ! ==="}' demo.txtawk -F ":" -v i=1 '{print $3 + i}' demo.txt # 定义变量,给第三列加1# awk 内置变量awk -F ":" '{printf("文件名: %s, 行号: %s, 该行一共 %s 列, 第一列: %s \n", FILENAME, NR, NF, $1)}' demo.txt# 打印空行的行号awk '/^$/ {printf("空行行号: %s \n", NR)}' demo.txtecho "================== wc ================="echo "Usage: wc [OPTION]... [FILE]..."echo "wc 会把文件名称打印出来,可以用awk去除"total_lines=$(wc -l demo.txt | awk -F " " '{print $1}')total_bytes=$(wc -c demo.txt | awk -F " " '{print $1}')echo "demo.txt ==>> 总行数: $total_lines, 总字节数: $total_bytes"echo "================ sort =================="echo "Usage: sort [OPTION]... [FILE]..."echo "-n, 按照数值排序-r, 反序-b, 忽略前导空格-t, 指定排序时所用的栏位分隔字符-k, 指定排序的列"echo "按照日排序(第三列)"sort -t "-" -k 3 -n sort.txtsort -t "-" -k 3 -n -r sort.txt

4. 实操

1. 基础

# 利用for循环建立user1~~user5总共五个账号,并且密码均为redhat# 提示man passwd命令中以标准输入方式给予账号密码。vim user.sh#!/bin/bashfor i in {1..5}do        useradd user$i        echo redhat | passwd --stdin user$idonesh user.sh# 访问网页#!/bin/bashurl=http://127.0.0.1code=$(curl -s -I -m 2 -o /dev/null $url -w %{http_code})if [ "$code" -eq 200 ]; then        echo "page is ok"else        echo "404"fi# 输入输出#!/bin/bashecho "输入用户名: "  #读取从键盘的输入  read usernameid $username &> /dev/nullif [ $? -eq 0 ] ; then        echo "user exists"else        useradd ${username}fi# case#!/bin/bashcase $1 in        a|A)                echo a;;        b|B)                echo b;;        *)                echo none;;esac# 测试ping#!/bin/bashfor i in {1..20}do        ping -c 5192.168.70.$i &> /dev/null        if [ $? -eq 0 ];then                echo "192.168.70.$i is up"        else                echo "192.168.70.$i is down"        fidone# 九九乘法表#!/bin/bashfor((i=1;i<=9;i++))do        for((j=1;j<=i;j++))        do                echo -n "${j}x${i}=$[i*j] "        done        echo done# 控制台给函数传参#!/bin/bash#test(){        echo "$1 and $2"}#test 1 2

2. 常见问题

#!/bin/bash# 计算demo.txt第三列总和third_sum=$(awk -F ":" -v sum=0 '{sum+=$3} END{print sum}' demo.txt)echo "第三列的和是: $third_sum"unset third_sum# 判断一个文件是否存在if [ -f sort.txt ]; then    echo "sort.txt 文件存在"else    echo "sort.txt 文件不存在"fi# 在当前目录查找包含字符 shen 的文件名称# uniq 去重# uniq 在后面显示行重复次数grep -r shen | awk -F ":" '{print $1}' | uniq -c# 输出 0 ~ 500 之间7的倍数#for ((i = 0; i <= 500; i++))#do#  if [ $((i % 7)) -eq 0 ]; then#    echo "$i"#  fi#done#unset "$i"#exit 0#for i in {0..500}#do#  if [ $((i % 7)) -eq 0 ]; then#    echo "$i"#  fi#done#unset "$i"#exit 0# 生成 0 ~ 500的数字, 步长为7# seq 0 7 500# 写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词。####示例:#假设 nowcoder.txt 内容如下:#how they are implemented and applied in computer##你的脚本应当输出:#how#they#are#and#applied#inawk '{  for (i=1; i <= NF; i++) {      if (length($i) < 8){          print $i      }  }}' n.txt# 打印出空行,或者只有空格和制表符的行awk 'NF == 0 {print NR}' n.txt# 统计每个单词出现的次数echo "===!!@@====="awk '{    for (i=1; i <= NF; i++) {        print $i    }}' now.txt | sort | uniq -c | awk '{printf("%s %s\n", $2, $1)}' | sort -k 2 -n > res.txtecho "====="awk '{ for (i = 1; i <= NF; ++i)     mp[$i]++;}END { for (k in mp)     printf("%s %d\n", k, mp[k]);}' now.txt | sort -k 1 -nawk '{print $2}' nowcoder.txt |sort -n |uniq -c |awk '$1 > 1 {print $0}'echo "假设每行列数相同,并且每个字段由空格分隔示例:假设 nowcoder.txt 内容如下:job salaryc++ 13java 14php 12你的脚本应当输出(以词频升序排列):job c++ java phpsalary 13 14 12"cols=$(sed "1q" nowcoder.txt | awk '{print NF}')for ((i = 1; i <= cols; i++)); do    awk -v k="$i" '{printf("%s ", $k)}' nowcoder.txt    echodoneecho "写一个 bash脚本以统计一个文本文件 nowcoder.txt中每一行出现的1,2,3,4,5数字个数并且要计算一下整个文档中一共出现了几个1,2,3,4,5数字数字总数。示例:假设 nowcoder.txt 内容如下:a12b810ccc2521abc9asf你的脚本应当输出:line1 number: 2line2 number: 1line3 number: 4line4 number: 0sum is 7"awk -F "" 'BEGIN{sum = 0}{    count = 0;    for (i = 0; i < NF; i++) {        if ($i == 1 || $i == 2 || $i == 3 || $i == 4 || $i == 5) {            count++;        }    }    sum += count;    printf("line%s number:%d\n", NR, count);}END{printf("sum is %d\n", sum)}' nowcoder.txtecho "写一个bash脚本以实现一个需求,求输入的一个的数组的平均值第1行为输入的数组长度N第2~N行为数组的元素,如以下为:数组长度为4,数组元素为1 2 9 8示例:41298那么平均值为:5.000(保留小数点后面3位)你的脚本获取以上输入应当输出:5.000"awk 'BEGIN{sum = 0; len = 0}{    if (NR == 1) {        len = $1;    } else {        sum += $1;    }}END{printf("%0.3f\n", sum / len)}'# xargs应用场景1: 批量更改当前目录下的文件名ls ./ | xargs -I GG echo "mv GG prefix_GG"ls ./ | xargs -I GG mv GG prefix_GG也可以这样批量更改该文件下的文件名for i in .g' | sed 's/^ *//g'`echo "$meminfo"#单位转换函数function convert_unit(){result=$1if [ $result -ge  1048576 ]thenvalue=1048576 #1024*1024result_gb=$(awk 'BEGIN{printf"%.2f\n",'$result' / '$value'}') #将KB转换成GB,并保留2位小数echo $result_gb"GB"elif [ $result -ge  1024 ]thenvalue=1024 result_mb=$(awk 'BEGIN{printf"%.2f\n",'$result' / '$value'}') #将KB转换成MB,并保留2位小数echo $result_mb"MB"elseecho $result"KB"fi}#单位:KBMemTotal=$(cat /proc/meminfo | awk '/^MemTotal/{print $2}') #内存总量MemFree=$(cat /proc/meminfo | awk '/^MemFree/{print $2}')   #空闲内存MemUsed=$(expr $MemTotal - $MemFree)  #已用内存##计算内存占用率Mem_Rate=$(awk 'BEGIN{printf"%.2f\n",'$MemUsed' / '$MemTotal' *100}') #保留小数点后2位MemShared=$(cat /proc/meminfo | awk '/^Shmem/{print $2}') #共享内存Buffers=$(cat /proc/meminfo | awk '/^Buffers/{print $2}') #文件缓冲区Cached=$(cat /proc/meminfo | awk '/^Cached/{print $2}') #用于高速缓冲存储器SwapTotal=$(cat /proc/meminfo | awk '/^SwapTotal/{print $2}') #交换区总量SwapFree=$(cat /proc/meminfo | awk '/^SwapFree/{print $2}') #空闲交换区Mapped=$(cat /proc/meminfo | awk '/^Mapped/{print $2}') #已映射##虚拟内存VmallocUsed=$(cat /proc/meminfo | awk '/^VmallocUsed/{print $2}') #已使用的虚拟内存echo "$(convert_unit $MemTotal)"echo "$(convert_unit $MemFree)"echo "$(convert_unit $MemUsed)"echo "$Mem_Rate%"echo "$(convert_unit $MemShared)"echo "$(convert_unit $Buffers)"echo "$(convert_unit $Cached)"echo "$(convert_unit $SwapTotal)"echo "$(convert_unit $SwapFree)"echo "$(convert_unit $Mapped)"echo "$(convert_unit $VmallocUsed)"#磁盘型号disk_model=`fdisk -l | grep "Disk model" | awk -F : '{print $2}' | sed 's/^ //'`echo "$disk_model"usesum=0totalsum=0disknum=`df -hlT |wc -l `for((n=2;n<=$disknum;n++))douse=$(df -k |awk NR==$n'{print int($3)}')pertotal=$(df -k |awk NR==$n'{print int($2)}')usesum=$[$usesum+$use]#计算已使用的总量totalsum=$[$totalsum+$pertotal]#计算总量donefreesum=$[$totalsum-$usesum]diskutil=$(awk 'BEGIN{printf"%.2f\n",'$usesum' / '$totalsum'*100}')freeutil=$(awk 'BEGIN{printf"%.2f\n",100 - '$diskutil'}')#磁盘总量if [ $totalsum -ge 0 -a $totalsum -lt 1024 ];thenecho "$totalsum K"elif [ $totalsum -gt 1024 -a  $totalsum -lt 1048576 ];thentotalsum=$(awk 'BEGIN{printf"%.2f\n",'$totalsum' / 1024}')echo "$totalsum M"elif [ $totalsum -gt 1048576 ];thentotalsum=$(awk 'BEGIN{printf"%.2f\n",'$totalsum' / 1048576}')echo "$totalsum G"fi#磁盘已使用总量if [ $usesum -ge 0 -a $usesum -lt 1024 ];thenecho "$usesum K"elif [ $usesum -gt 1024 -a  $usesum -lt 1048576 ];thenusesum=$(awk 'BEGIN{printf"%.2f\n",'$usesum' / 1024}')echo "$usesum M"elif [ $usesum -gt 1048576 ];thenusesum=$(awk 'BEGIN{printf"%.2f\n",'$usesum' / 1048576}')echo "$usesum G"fi#磁盘未使用总量if [ $freesum -ge 0 -a $freesum -lt 1024 ];thenecho "$freesum K"elif [ $freesum -gt 1024 -a  $freesum -lt 1048576 ];thenfreesum=$(awk 'BEGIN{printf"%.2f\n",'$freesum' / 1024}')echo "$freesum M"elif [ $freesum -gt 1048576 ];thenfreesum=$(awk 'BEGIN{printf"%.2f\n",'$freesum' / 1048576}')echo "$freesum G"fi#磁盘占用率echo "$diskutil%"#磁盘空闲率echo "$freeutil%"#显卡型号graphicscardmodel=`lspci | grep -i 'VGA' | sed '2d' | cut -f3 -d ":" | sed 's/([^>]*)//g'`echo "$graphicscardmodel"#显卡生产商graphicscardmanufacturer=`lspci | grep -i 'VGA'| sed '2d'| awk '{ print $5,$6 }'`echo "$graphicscardmanufacturer"#主板厂商boardmanufacturer=`sudo dmidecode | grep -A 10 "Base Board Information" |grep "Manufacturer" | awk -F ':' '{print $2}'`echo "$boardmanufacturer"#主板名称boardname=`sudo dmidecode | grep -A 10 "Base Board Information" |grep "Product Name" | awk -F ':' '{print $2}'`echo "$boardname"#BIOS厂商biosvendor=`sudo dmidecode | grep -A 28 "BIOS Information" | grep 'Vendor' | awk -F ':' '{print $2}'`echo "$biosvendor"#BIOS版本biosversion=`sudo dmidecode | grep -A 28 "BIOS Information" | grep 'Version' | awk -F ':' '{print $2}'`echo "$biosversion"#BIOS发行日期biosrelease=`sudo dmidecode | grep -A 28 "BIOS Information" | grep 'Release' | awk -F ':' '{print $2}'`echo "$biosrelease"#网卡信息netcardinfo=`lspci | grep -i eth | head -n +1 | awk -F : '{print $3}' | sed 's/^ //'`echo "$netcardinfo"

4. 获取硬件使用率

#!/bin/bash# 获取要监控的本地服务器IP地址IP=`ifconfig | grep inet | grep -vE 'inet6|127.0.0.1' | awk '{print $2}'`echo "IP地址:"$IP # 获取cpu总核数cpu_num=`grep -c "model name" /proc/cpuinfo`echo "cpu总核数:"$cpu_num # 1、获取CPU利用率#################################################us 用户空间占用CPU百分比#sy 内核空间占用CPU百分比#ni 用户进程空间内改变过优先级的进程占用CPU百分比#id 空闲CPU百分比#wa 等待输入输出的CPU时间百分比#hi 硬件中断#si 软件中断################################################## 获取用户空间占用CPU百分比cpu_user=`top -b -n 1 | grep Cpu | awk '{print $2}' | cut -f 1 -d "%"`echo "用户空间占用CPU百分比:"$cpu_user # 获取内核空间占用CPU百分比cpu_system=`top -b -n 1 | grep Cpu | awk '{print $4}' | cut -f 1 -d "%"`echo "内核空间占用CPU百分比:"$cpu_system # 获取空闲CPU百分比cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}' | cut -f 1 -d "%"`echo "空闲CPU百分比:"$cpu_idle # 获取等待输入输出占CPU百分比cpu_iowait=`top -b -n 1 | grep Cpu | awk '{print $10}' | cut -f 1 -d "%"`echo "等待输入输出占CPU百分比:"$cpu_iowait #2、获取CPU上下文切换和中断次数# 获取CPU中断次数cpu_interrupt=`vmstat -n 1 1 | sed -n 3p | awk '{print $11}'`echo "CPU中断次数:"$cpu_interrupt # 获取CPU上下文切换次数cpu_context_switch=`vmstat -n 1 1 | sed -n 3p | awk '{print $12}'`echo "CPU上下文切换次数:"$cpu_context_switch #3、获取CPU负载信息# 获取CPU15分钟前到现在的负载平均值cpu_load_15min=`uptime | awk '{print $11}' | cut -f 1 -d ','`echo "CPU 15分钟前到现在的负载平均值:"$cpu_load_15min # 获取CPU5分钟前到现在的负载平均值cpu_load_5min=`uptime | awk '{print $10}' | cut -f 1 -d ','`echo "CPU 5分钟前到现在的负载平均值:"$cpu_load_5min # 获取CPU1分钟前到现在的负载平均值cpu_load_1min=`uptime | awk '{print $9}' | cut -f 1 -d ','`echo "CPU 1分钟前到现在的负载平均值:"$cpu_load_1min # 获取任务队列(就绪状态等待的进程数)cpu_task_length=`vmstat -n 1 1 | sed -n 3p | awk '{print $1}'`echo "CPU任务队列长度:"$cpu_task_length #4、获取内存信息# 获取物理内存总量mem_total=`free | grep Mem | awk '{print $2}'`echo "物理内存总量:"$mem_total # 获取操作系统已使用内存总量mem_sys_used=`free | grep Mem | awk '{print $3}'`echo "已使用内存总量(操作系统):"$mem_sys_used # 获取操作系统未使用内存总量mem_sys_free=`free | grep Mem | awk '{print $4}'`echo "剩余内存总量(操作系统):"$mem_sys_free # 获取应用程序已使用的内存总量mem_user_used=`free | sed -n 3p | awk '{print $3}'`echo "已使用内存总量(应用程序):"$mem_user_used # 获取应用程序未使用内存总量mem_user_free=`free | sed -n 3p | awk '{print $4}'`echo "剩余内存总量(应用程序):"$mem_user_free  # 获取交换分区总大小mem_swap_total=`free | grep Swap | awk '{print $2}'`echo "交换分区总大小:"$mem_swap_total # 获取已使用交换分区大小mem_swap_used=`free | grep Swap | awk '{print $3}'`echo "已使用交换分区大小:"$mem_swap_used # 获取剩余交换分区大小mem_swap_free=`free | grep Swap | awk '{print $4}'`echo "剩余交换分区大小:"$mem_swap_free #5、获取磁盘I/O统计信息echo "指定设备(/dev/sda)的统计信息"# 每秒向设备发起的读请求次数disk_sda_rs=`iostat -kx | grep sda| awk '{print $4}'`echo "每秒向设备发起的读请求次数:"$disk_sda_rs # 每秒向设备发起的写请求次数disk_sda_ws=`iostat -kx | grep sda| awk '{print $5}'`echo "每秒向设备发起的写请求次数:"$disk_sda_ws # 向设备发起的I/O请求队列长度平均值disk_sda_avgqu_sz=`iostat -kx | grep sda| awk '{print $9}'`echo "向设备发起的I/O请求队列长度平均值"$disk_sda_avgqu_sz # 每次向设备发起的I/O请求平均时间disk_sda_await=`iostat -kx | grep sda| awk '{print $10}'`echo "每次向设备发起的I/O请求平均时间:"$disk_sda_await # 向设备发起的I/O服务时间均值disk_sda_svctm=`iostat -kx | grep sda| awk '{print $11}'`echo "向设备发起的I/O服务时间均值:"$disk_sda_svctm # 向设备发起I/O请求的CPU时间百分占比disk_sda_util=`iostat -kx | grep sda| awk '{print $12}'`echo "向设备发起I/O请求的CPU时间百分占比:"$disk_sda_util

5. 密码比对

#!/bin/bashCOUNT=0PASSWD=12345while [ $COUNT -lt 3 ]do        read -p "input passwd:" password        if [ "$password" = "$PASSWD" ];then                echo "right"                exit        else                echo "wrong"                let COUNT++        fidoneecho "too many wrong!"

6. 磁盘监控

df -hl 查看磁盘剩余空间 df -h 查看每个根路径的分区大小 du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文件夹总M数 du -h [目录名] 查看指定文件夹下的所有文件大小(包含子文件夹)查看硬盘的分区 #sudo fdisk -l查看IDE硬盘信息 #sudo hdparm -i /dev/hda查看STAT硬盘信息 #sudo hdparm -I /dev/sda 或 #sudo apt-get install blktool #sudo blktool /dev/sda id查看硬盘剩余空间 #df -h #df -H查看目录占用空间 #du -hs 目录名使用命令查看指定目录空间情况,例如查看opt目录du -h --max-depth=1 /opt#!/bin/bashecho "磁盘当前实时读写速率:"# 每秒向设备发起的读请求次数disk_sda_rs=`iostat -kx | grep sda| awk '{print $4}'`echo "每秒向设备发起的读请求次数:"$disk_sda_rs# 每秒向设备发起的写请求次数disk_sda_ws=`iostat -kx | grep sda| awk '{print $5}'`echo "每秒向设备发起的写请求次数:"$disk_sda_wsmax_filesys_use=`df -h | sort -nr -k5 | head -n1`echo "最大文件系统使用率:"echo $max_filesys_useecho "磁盘使用情况:"df -h | grep "/dev/sda"disk_use=`df -h | grep "/dev/sda" | awk '{print $5}' | cut -d '%' -f 1`echo "磁盘使用率: $disk_use%"echo "inode监控:"df -i

来源地址:https://blog.csdn.net/u012132164/article/details/128701880

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯