# Shell命令
## 编写Shell脚本,完成一个对端口eth33的实时流量监控并输出
实验步骤如下:
1. 在命令行中执行命令touch thirdShell.sh以创建第三个Shell脚本。
```shell
[root@localhost ~]# touch thirdShell.sh
```
2. 在命令行中执行命令vi thirdShell.sh进入Shell脚本开始编写。
```shell
[root@localhost ~]# vi thirdShell.sh
```
3. 点击键盘上“i”按键开始写入,写入脚本如下:
```shell
#!/bin/bash 带#是注释
eth0=$1 #表示eth0为输入数据"sh thirdShell.sh ens33 b c"的第一个,$n表示输入数据的第n个
echo -e "in--out" #-e为激活转义字符 例如\t为加入tab
while true; do # 循环语句,这个循环会一直运行
old_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
#grep命令是linux中一种强大的文本搜索工具,并把匹配的端口$eth0行打印出来
#awk使用字段操作符$来指定字段。在该操作符后面跟着一个数字或变量,用于标识字段的位置。“$1”表示第一个字段,“$2”表示第二个字段 等等。“$0”表示整个输入记录。
#旧的输入流量
old_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
#旧的输出流量
sleep 1 #等一秒钟
new_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
new_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
#同理
in=$(printf "%.1f%s" "$((($new_in-$old_in)/1024))" "KB/s")
out=$(printf "%.1f%s" "$((($new_out-$old_out)/1024))" "KB/s")
# 计算一秒钟进来的流量和出去的流量
echo "$in $out"
#输出一秒钟进来的流量和出去的流量
done
```
4. 点击键盘上“Esc”键,输入“:wq”并回车,退出vim。
5. 输入命令 sh thirdShell.sh ens33 或 bash thirdShell.sh ens33运行thirdShell.sh脚本,最后查看输出结果。
## 编写Shell脚本,要求输出CPU、IO接口、硬盘、内存的使用情况以及TCP连接的情况。
1. 在命令行中执行命令touch forthShell.sh以创建第四个Shell脚本。
```shell
[root@localhost ~]# touch forthShell.sh
```
2. 在命令行中执行命令vi forthShell.sh进入Shell脚本开始编写。
```shell
[root@localhost ~]# vi forthShell.sh
```
3. 点击键盘上“i”按键开始写入,写入脚本如下:
```shell
#!/bin/bash
function cpu(){
util=$(vmstat | awk '{if(NR==3)print $13+$14}')
#第三行13、14列相加为cpu使用率
iowait=$(vmstat | awk '{if(NR==3)print $16}')
#16列为等待磁盘io使用率
echo " CPU - Usage:${util}% , disk IO to be utilized accordingly:${iowait}:${iowait}%"
#输出
}
function memory (){
total=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}'`
#free 命令 可以显示当前系统未使用的和已使用的内存数目 free-m显示如下
# total used free shared buffers available
# MEM:
# SWap:
#第二行第二列除以1024
used=`free -m |awk '{if(NR==2) printf "%.1f",($2-$NF)/1024}'`
#第二行的第二列与最后一列的差除以1024
available=`free -m |awk '{if(NR==2) printf "%.1f",$NF/1024}'`
echo " Memory - Total size: ${total}G , used: ${used}G , remainder: ${available}G"
}
disk(){
#磁盘使用情况函数
fs=$(df -h |awk '/^\/dev/{print $1}')
for p in $fs; do
#遍历/dev开头的行,挂载点记录最后一列,容量记录第二列,已使用记录第三列,使用率记录第5列
mounted=$(df -h |awk '$1=="'$p'"{print $NF}')
size=$(df -h |awk '$1=="'$p'"{print $2}')
used=$(df -h |awk '$1=="'$p'"{print $3}')
used_percent=$(df -h |awk '$1=="'$p'"{print $5}')
echo " Hard Disk - Mount Point: $mounted , Total size: $size , used: $used , Usage: $used_percent"
done
}
function tcp_status() {
#tcp连接情况函数
summary=$(ss -antp |awk '{status[$1]++}END{for(i in status) printf i":"status[i]" "}')
#第一列记录ss-antp每个状态数量,除了State表头
echo " TCP connection status - $summary"
}
cpu
memory
disk
tcp_status
```
4. 点击键盘上“Esc”键,输入“:wq”并回车,退出vim。
5. 输入命令 sh forthShell.sh 或 bash forthShell.sh运行forthShell.sh脚本,最后查看输出结果。