1、实时监控cpu、内存的shell脚本
bash
#!/bin/bash
# 获取当前时间
DATE=$(date +"%Y-%m-%d %H:%M:%S")
# 获取CPU使用情况
CPU_USAGE=$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}')
# 获取内存使用情况
MEMORY_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
# 输出结果
echo "$DATE CPU使用率: $CPU_USAGE% 内存使用率: $MEMORY_USAGE%"
top命令用于实时显示系统的任务管理器信息。它提供了关于系统中当前运行进程的动态视图,并允许用户监控系统的性能。
常用选项:
-d 秒数 设置刷新间隔时间,例如 top -d 2 每两秒刷新一次。
-p PID 只显示指定 PID 的进程,例如 top -p 1234 只显示 PID 为 1234 的进程。
-u 用户名 只显示指定用户的进程,例如 top -u user 只显示用户 user 的进程。
-b 批处理模式,通常与重定向结合使用,例如 top -b > top_output.txt。
-n 次数 设置刷新次数后退出,例如 top -n 10 刷新 10 次后退出。
free命令提供了关于物理内存(RAM)、交换空间(swap)以及缓冲区/缓存(buff/cache)的详细信息。这
常用选项:
-b 以字节为单位显示内存使用情况。
-k 以千字节(KB)为单位显示内存使用情况(这是默认设置)。
-m 以兆字节(MB)为单位显示内存使用情况。
-g 以吉字节(GB)为单位显示内存使用情况。
-h 以人类可读的格式显示内存使用情况,自动选择合适的单位(KB、MB、GB)。
-s 秒数 每隔指定的秒数重复显示内存使用情况。
-t 显示总计行,即所有内存和交换空间的总和。
-c 次数 重复显示内存使用情况指定的次数后退出
2、进入脚本所在目录
bash
# shell脚本
#!/bin/bash
# 当前目录
cur_dir=`pwd`
echo "当前执行脚本的目录:$cur_dir"
# 脚本目录
script_dir=`dirname $0`
echo "脚本父目录:$script_dir"
# 进入到脚本目录
script_root_dir=$(cd `dirname $0`;pwd)
echo "脚本的绝对路径:$script_root_dir"
结果:
bash
[root@local_tmp]#
[root@local_tmp]# ../shell/s-5.sh
当前执行脚本的目录:/home/test/linux
脚本父目录:../shell
脚本的绝对路径:/home/test/shell
[root@local_tmp]#
[root@local_tmp]#
3、操作目录
bash
#!/bin/bash
# 创建目录
# 指定要创建的文件夹名称
echo "--------------------------------------------------------"
path="path/parent_folder"
# 使用mkdir命令创建文件夹
mkdir -p "$path/$folder_name"
echo "Folder '$folder_name' created at '$path'."
# 删除目录
# 指定要删除的文件夹路径
echo "--------------------------------------------------------"
folder_path="path/folder_to_delete"
# 检查文件夹是否存在
if [ -d "$folder_path" ]; then
# 使用rm命令删除文件夹及其内容
rm -rf "$folder_path"
echo "Folder '$folder_path' deleted."
else
echo "Folder '$folder_path' does not exist."
fi
# 移动目录
# 指定要移动的文件夹路径和目标路径
echo "--------------------------------------------------------"
source_folder="path/source_folder"
destination_folder="path/destination"
# 使用mv命令移动文件夹
mv "$source_folder" "$destination_folder"
echo "Folder moved from '$source_folder' to '$destination_folder'."
# 复制文件夹
# 指定要复制的文件夹路径和目标路径
echo "--------------------------------------------------------"
source_folder="/path/source_folder"
destination_folder="/path/destination"
# 使用cp命令复制文件夹及其内容
cp -r "$source_folder" "$destination_folder"
echo "Folder copied from '$source_folder' to '$destination_folder'."
# 遍历目录
echo "--------------------------------------------------------"
for file in *; do
if [ -d "$file" ]; then
echo "$file 是一个目录"
elif [ -f "$file" ]; then
echo "$file 是一个文件"
fi
done
# 遍历目录
# 遍历指定目录及其子目录中的所有文件
echo "--------------------------------------------------------"
find path/ -type f | while read -r file; do
echo "$file 是一个文件"
done
# 遍历指定目录及其子目录中的所有目录
find path/ -type d | while read -r dir; do
echo "$dir 是一个目录"
done
# 遍历目录
process_file() {
local file="$1"
echo "处理文件: $file"
# 在这里添加处理文件的代码
}
process_directory() {
local dir="$1"
echo "进入目录: $dir"
# 在这里可以添加处理目录的代码,比如递归调用本脚本处理子目录
for item in "$dir"/*; do
if [ -d "$item" ]; then
process_directory "$item" # 递归处理子目录
elif [ -f "$item" ]; then
process_file "$item" # 处理文件
fi
done
echo "离开目录: $dir"
}
# 从指定目录开始遍历
start_directory="path/"
process_directory "$start_directory"
4、循环操作--数组
bash
#!/bin/bash
rm -rf result.txt
# 循环打印日志过滤结果
lst=(lst_1 lst_2 lst_3 lst__4)
for st in "${lst[@]}"
do
echo $st
python3 process.py $st &> log
cat log | grep "abcdefg-HIGKLMN" | awk '{print $31}' >> result.txt
echo " " >> result.txt
done
bash
shell中数组介绍:
1、声明数组
可以使用圆括号 () 来声明数组,元素之间用空格分隔:
my_array=(element1 element2 element3)
也可以单独指定数组元素:
my_array[0]=element1
my_array[1]=element2
my_array[2]=element3
2、访问数组元素
使用数组的索引来访问元素,索引从0开始:
# 访问第一个元素
echo ${my_array[0]}
# 访问第二个元素
echo ${my_array[1]}
使用 @ 或 * 来获取数组的所有元素:
# 获取数组的所有元素
echo ${my_array[@]}
# 或者
echo ${my_array[*]}
使用 ${#array[@]} 或 ${#array[*]} 来获取数组的长度:
# 获取数组的长度
length=${#my_array[@]}
echo "数组的长度是: $length"
你可以使用 for 循环来遍历数组的所有元素:
# 使用 for 循环遍历数组
for element in "${my_array[@]}"; do
echo "$element"
done
数组切片:
# 获取数组的前两个元素
slice=${my_array[@]:0:2}
echo "切片: $slice"
修改数组元素:
# 修改第一个元素
my_array[0]=new_element1
# 输出修改后的数组
echo ${my_array[@]}
删除数组元素:
# 删除第二个元素
unset my_array[1]
# 输出修改后的数组
echo ${my_array[@]}
5、循环操作--读取文件每行内容
bash
#!/bin/bash
cat file.lst | while read line; do
echo ${line}
done
6、按指定列的内容过滤文件的行
bash
#!/bin/bash
cat all.lst | awk -F ":" '{if($5 == 1 || $5 == 2) print $1}'
7、shell读取json文件
需要Linux上安装jq模块。
bash
#!/bin/bash
json_str=$1
# 提取字段值
aaa=$(echo "$json_str" | jq -r '.aaaaa')
if [ $? -ne 0 ]; then
exit 1
fi
bbb=$(echo "$json_str" | jq -r '.bbbbb')
if [ $? -ne 0 ]; then
exit 1
fi
ccc=$(echo "$json_str" | jq -r '.ccccc')
if [ $? -ne 0 ]; then
exit 1
fi
#
# json文件
# {
# "aaaaa": "----aaaaa",
# "bbbbb": "----bbbbb",
# "ccccc": "----ccccc"
# }
#
8、$?变量
bash
$?变量:
这是一个特殊变量,表示上一个命令的退出状态码(Exit Status)。
退出码 0 表示成功。
非零退出码(如 1, 2, ...)表示失败或错误。