Operations 40 min read

Essential Linux Shell Scripts for System Backup, Monitoring, and Automation

This article compiles a comprehensive set of Linux shell scripts and command snippets covering zombie‑process detection, MySQL and directory backups, network ping scans, disk I/O diagnostics, performance monitoring, process management, Java dumps, common tool and library installations, system health checks, and advanced sed techniques, providing practical automation for system administrators.

Open Source Linux
Open Source Linux
Open Source Linux
Essential Linux Shell Scripts for System Backup, Monitoring, and Automation

Zombie Process and Miscellaneous Commands

# 查看僵尸进程
ps -al | gawk '{print $2,$4}' | grep Z

# 匹配电子邮件的地址
cat index.html | egrep -o "[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}" > ans.txt

# 匹配 http URL
cat index.html | egrep -o "http://[A-Za-z0-9.]+\.[a-zA-Z]{2,3}" > ans.txt

# 纯文本形式下载网页
lynx -dump www.baidu.com > plain.txt

# 只打印 HTTP 头部信息,无须远程下载文件
curl --head www.baidu.com

# 使用 POST 提交数据
curl -d "param2=nickwolfe¶m2=12345" http://www.linuxidc.com/login.cgi

# 显示分组途经的网关
traceroute www.baidu.com

# 列出系统中的开放端口以及运行在端口上的服务
lsof -i

# nc 命令建立 socket 连接
# 设置监听
nc -l 5555
# 连接到套接字
nc 192.0.0.1 5555

# 快速文件传输(接收端)
nc -l 5555 > destination_filename
# 发送端
nc 192.0.0.1 5555 < source_filename

# 找出指定目录最大的 n 个文件
du -ak target_dir | sort -nrk 1 | head -n 4

# 向终端中的所有登陆用户发送广播信息
cat message.txt | wall

# 创建新的 screen 窗口
screen

# 打印所有的 .txt 和 .pdf 文件
find . \( -name "*.txt" -o -name "*.pdf" \) -print

# -exec command {} \; 用法示例(对所有匹配文件执行命令)

# 将文件分割成多个大小为 10KB 的文件
split -b 10k data.file

# 打印两个文件的交集
comm A.txt B.txt -3 | sed 's/^\t//'

# sed 移除空白行
sed '/^$/d' file

MySQL Backup Script (mysql备份)

#!/bin/bash
set -e
USER="backup"
PASSWORD="backup"
# 数据库数据目录
DATA_DIR="/data/mysql"
BIN_INDEX="$DATA_DIR/mysql-bin.index"
# 备份目录
BACKUP_DIR="/data/backup/mysql"
BACKUP_LOG="/var/log/mysql/backup.log"

DATE=$(date +"%Y%m%d")
TIME=$(date +"%Y%m%d%H")
LOG_TIME=$(date +"%Y-%m-%d %H:%M:%S")
DELETE_BINLOG_TIME="7 day"
INCREMENT_INTERVAL="3 hour"

note(){ printf "[${LOG_TIME}] note: $*
" >> $BACKUP_LOG; }
warning(){ printf "[${LOG_TIME}] warning: $*
" >> $BACKUP_LOG; }
error(){ printf "[${LOG_TIME}] error: $*
" >> $BACKUP_LOG; exit 1; }

full_backup(){
    local dbs=$(ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}')
    for db in $dbs; do
        local backup_dir="$BACKUP_DIR/full/$db"
        local filename="$db.$DATE"
        local backup_file="$backup_dir/$filename.sql"
        if [ ! -d $backup_dir ]; then
            mkdir -p $backup_dir || { error "创建数据库 $db 全量备份目录 $backup_dir 失败"; continue; }
            note "数据库 $db 全量备份目录 $backup_dir 不存在,创建完成"
        fi
        note "full backup $db start ..."
        mysqldump --user=${USER} --password=${PASSWORD} --flush-logs --skip-lock-tables --quick $db > $backup_file || { warning "数据库 $db 备份失败"; continue; }
        cd $backup_dir
        tar -cPzf $filename.tar.gz $filename.sql
        rm -f $backup_file
        chown -fR mysql:mysql $backup_dir
        note "数据库 $db 备份成功"
        note "full backup $db end."
    done
}

increment_backup(){
    local StartTime=$(date -d "$INCREMENT_INTERVAL ago" +"%Y-%m-%d %H:%M:%S")
    local DELETE_BINLOG_END_TIME=$(date -d "$DELETE_BINLOG_TIME ago" +"%Y-%m-%d %H:%M:%S")
    local dbs=$(ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}')
    mysql -u$USER -p$PASSWORD -e "purge master logs before '$DELETE_BINLOG_END_TIME'" && note "delete $DELETE_BINLOG_TIME days before log"
    filename=$(cat $BIN_INDEX | awk -F "/" '{print $2}')
    for i in $filename; do
        for db in $dbs; do
            local backup_dir="$BACKUP_DIR/increment/$db"
            local filename="$db.$TIME"
            local backup_file="$backup_dir/$filename.sql"
            if [ ! -d $backup_dir ]; then
                mkdir -p $backup_dir || { error "创建数据库 $db 增量备份目录 $backup_dir 失败"; continue; }
                note "数据库 $db 增量备份目录 $backup_dir 不存在,创建完成"
            fi
            note "increment backup $db from time $StartTime start ..."
            mysqlbinlog -d $db --start-datetime="$StartTime" $DATA_DIR/$i >> $backup_file || { warning "数据库 $db 备份失败"; continue; }
            note "increment backup $db end."
        done
    done
    for db in $dbs; do
        local backup_dir="$BACKUP_DIR/increment/$db"
        local filename="$db.$TIME"
        local backup_file="$backup_dir/$filename.sql"
        cd $backup_dir
        tar -cPzf $filename.tar.gz $filename.sql
        rm -f $backup_file
        note "数据库 $db 备份成功"
    done
}

case "$1" in
    full) full_backup ;;
    increment) increment_backup ;;
    *) exit 2 ;;
esac
exit 1

Directory Backup Script (目录备份)

#!/bin/bash
DATE=$(date '+%Y-%m-%d_%H_%M_%S')
BACKUPDIR="/home/backups"
SORFILE=/opt
DESFILE="/home/backups/${SORFILE}.$(date '+%Y-%m-%d_%H_%M_%S').zip"
[ ! -d $BACKUPDIR ] && mkdir -p $BACKUPDIR
cd $BACKUPDIR

echo "start backup $SORFILE ..."
sleep 3
zip -r $DESFILE $SORFILE &>/dev/null
if [ "$?" == "0" ]; then
   echo $(date +%Y-%m-%d) " zip success" >> backup.log
else
   echo $(date +%Y-%m-%d) " zip failed" >> backup.log
   exit 0
fi
# 删除 3 天前的备份
find $BACKUPDIR -type f -ctime +3 | xargs rm -rf

Ping Scan Script (PING查询)

#!/bin/bash
# 用于根据网络配置对 192.168.0.0/24 地址进行并行 ping 检测
for ip in 192.168.0.{1..255}; do
    (
    ping $ip -c 2 &>/dev/null
    if [ $? -eq 0 ]; then
        echo $ip is alive
    fi
    )&
 done
wait
# 并行 ping 加速

Disk I/O Check Commands (磁盘IO检查)

# iostat 查看磁盘活动统计情况
# 显示所有设备负载情况
iostat
# 每隔 2 秒刷新磁盘 IO 信息,显示 3 次
iostat 2 3
# 显示某个磁盘的 IO 信息
iostat -d sda1
# 显示 tty 和 cpu 信息
iostat -t
# 以 MB 为单位显示磁盘 IO 信息
iostat -m
# 查看 TPS 和吞吐量信息
iostat -d -k 1 1
# 查看设备使用率(%util)和响应时间(await)
iostat -d -x -k 1 1
# 查看 CPU 状态
iostat -c 1 3
# 统计进程 (pid) 的 stat,包括 IO 状况
pidstat
# 只显示 IO
pidstat -d 1
# 详细 IO、内存、CPU 信息
pidstat -u -r -d -t 1
# 文件级 IO 分析,查看当前文件由哪些进程打开
lsof
ls /proc/pid/fd
# 使用 sar 报告磁盘 I/O 信息
sar -pd 10 3
# iotop(IO 版 top)
iotop
# 查看页面缓存信息
cat /proc/meminfo
# 查看 pdflush 进程数量
cat /proc/sys/vm/nr_pdflush_threads
# 查看 I/O 调度器
cat /sys/block/[disk]/queue/scheduler
# 改变 I/O 调度器
echo deadline > /sys/block/sdX/queue/scheduler
# 提高调度器请求队列的深度
echo 4096 > /sys/block/sdX/queue/nr_requests

Performance Related Commands (性能相关)

# 查看当前系统 load
uptime
# 查看系统状态和每个进程的资源使用情况
top
# 可视化显示 CPU 使用状况
htop
# 查看每个 CPU 的负载信息
mpstat -P ALL 1
# 每隔 1 秒查看磁盘 IO 统计信息
iostat -xkdz 1
# 每隔一秒查看虚拟内存使用信息
vmstat 1
# 查看内存使用统计信息
free
# 查看网络使用信息
nicstat -z 1
# 类似 vmstat 的显示优化工具
dstat 1
# 查看系统活动状态(分页、块设备 IO 等)
sar
# 网络连接状态查看
netstat -s
# 进程资源使用信息查看
pidstat 1
pidstat -d 1
# 查看某个进程的系统调用信息
strace -tttT -p 12670
# 统计 IO 设备输入输出的系统调用信息
strace -c dd if=/dev/zero of=/dev/null bs=512 count=1024k
# tcpdump 查看网络数据包
tcpdump -nr /tmp/out.tcpdump
# 块设备的读写事件信息统计
btrace /dev/sdb
# iotop 查看某个进程的 IO 操作统计信息
iotop -bod5
# slabtop 查看内核 slab 内存分配器使用信息
slabtop -sc
# 系统参数设置
sysctl -a
# 系统性能指标统计信息
perf stat gzip file1
# 系统 CPU 活动状态查看
perf record -a -g -F 997 sleep 10

Process Management Commands (进程相关)

# 查看当前系统执行的线程列表(瞬时)
ps
# 显示所有进程详细信息
ps aux
# -u 显示某个用户的进程列表
ps -f -u www-data
# -C 通过名字或命令搜索进程
ps -C apache2
# --sort 根据进程 CPU 使用率降序排列,查看前 5 个进程
ps aux --sort=-pcpu | head -5
# -f 用树结构显示进程层次关系
ps -f --forest -C apache2
# 显示一个父进程的所有子进程
ps -o pid,uname,comm -C apache2
ps --ppid 2359
# 显示一个进程的所有线程 -L 参数
ps -p 3150 -L
# 显示进程的执行时间 -o 参数
ps -e -o pid,comm,etime
# watch 实时捕捉 ps 显示进程
watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15'
# jobs 查看后台运行的进程
jobs
# 查看后台运行的进程号
jobs -p
# 查看已终止或退出的进程号
jobs -n
# kill 终止进程(Ctrl+C)
kill 12
# 发送指定信号(默认 SIGTERM)
kill -2 123   # 发送 SIGINT(Ctrl+C)
kill -9 123   # 强制终止
# 列出所有信号名称
kill -l
# 发送指定信号的数值
kill -l KILL
# 杀死指定用户所有进程
kill -u peidalinux
kill -9 $(ps -ef | grep peidalinux)
# 将后台命令调至前台继续运行
fg 123
# 将后台暂停的命令继续执行
bg 123
# nohup 让进程在退出终端后继续运行
nohup command > myout.file 2>&1 &
# at 计划任务(一次性)
at 12:00
# 查看已计划但未执行的任务
atq
# 删除计划任务
atrm 1
# pstree 列出进程树结构
pstree
# nice 改变程序执行的优先级(-20~19)
nice -n 5 ls
# renice 修改正在运行进程的优先级
renice -5 -p 5200
# pmap 显示进程的内存映射
pmap 20367

Java Dump Script (javadump.sh)

#!/bin/sh
DUMP_PIDS=$(ps --no-heading -C java -f --width 1000 | awk '{print $2}')
if [ -z "$DUMP_PIDS" ]; then
    echo "The server $HOST_NAME is not started!"
    exit 1;
fi

DUMP_ROOT=~/dump
[ ! -d $DUMP_ROOT ] && mkdir $DUMP_ROOT

DUMP_DATE=$(date +%Y%m%d%H%M%S)
DUMP_DIR=$DUMP_ROOT/dump-$DUMP_DATE
[ ! -d $DUMP_DIR ] && mkdir $DUMP_DIR

for PID in $DUMP_PIDS; do
    $JAVA_HOME/bin/jstack $PID > $DUMP_DIR/jstack-$PID.dump 2>&1
    $JAVA_HOME/bin/jinfo $PID > $DUMP_DIR/jinfo-$PID.dump 2>&1
    $JAVA_HOME/bin/jstat -gcutil $PID > $DUMP_DIR/jstat-gcutil-$PID.dump 2>&1
    $JAVA_HOME/bin/jstat -gccapacity $PID > $DUMP_DIR/jstat-gccapacity-$PID.dump 2>&1
    $JAVA_HOME/bin/jmap $PID > $DUMP_DIR/jmap-$PID.dump 2>&1
    $JAVA_HOME/bin/jmap -heap $PID > $DUMP_DIR/jmap-heap-$PID.dump 2>&1
    $JAVA_HOME/bin/jmap -dump:format=b,file=$DUMP_DIR/jmap-dump-$PID.dump $PID 2>&1
    if [ -r /usr/sbin/lsof ]; then
        /usr/sbin/lsof -p $PID > $DUMP_DIR/lsof-$PID.dump
    fi
done

if [ -r /usr/bin/sar ]; then
    /usr/bin/sar > $DUMP_DIR/sar.dump
fi
if [ -r /usr/bin/uptime ]; then
    /usr/bin/uptime > $DUMP_DIR/uptime.dump
fi
if [ -r /usr/bin/free ]; then
    /usr/bin/free -t > $DUMP_DIR/free.dump
fi
if [ -r /usr/bin/vmstat ]; then
    /usr/bin/vmstat > $DUMP_DIR/vmstat.dump
fi
if [ -r /usr/bin/mpstat ]; then
    /usr/bin/mpstat > $DUMP_DIR/mpstat.dump
fi
if [ -r /usr/bin/iostat ]; then
    /usr/bin/iostat > $DUMP_DIR/iostat.dump
fi
if [ -r /bin/netstat ]; then
    /bin/netstat > $DUMP_DIR/netstat.dump
fi

echo "OK!"

Common Tools Installation Script (常用工具安装)

#!/usr/bin/env bash
# 控制台颜色
BLACK="\033[1;30m"
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
BLUE="\033[1;34m"
PURPLE="\033[1;35m"
CYAN="\033[1;36m"
RESET="$(tput sgr0)"

printf "${BLUE}
"
cat << EOF
###################################################################################
# 安装常用命令工具
# 核心工具:df、du、chkconfig
# 网络工具:ifconfig、netstat、route、iptables
# IP工具:ip、ss、ping、tracepath、traceroute
# DNS工具:dig、host、nslookup、whois
# 端口工具:lsof、nc、telnet
# 下载工具:curl、wget
# 编辑工具:emacs、vim
# 流量工具:iftop、nethogs
# 抓包工具:tcpdump
# 压缩工具:unzip、zip
# 版本控制工具:git、subversion
###################################################################################
EOF
printf "${RESET}
"
printf "
${GREEN}>>>>>>>>>> 安装常用命令工具开始${RESET}
"
# 核心工具
printf "
${CYAN}>>> install coreutils(df、du)${RESET}
"
yum install -y coreutils
printf "
${CYAN}>>> install chkconfig${RESET}
"
yum install -y chkconfig
# 网络工具
printf "
${CYAN}>>> install net-tools(ifconfig、netstat、route)${RESET}
"
yum install -y net-tools
printf "
${CYAN}>>> install iptables${RESET}
"
yum install -y iptables
# IP工具
printf "
${CYAN}>>> install iputils(ping、tracepath)${RESET}
"
yum install -y iputils
printf "
${CYAN}>>> install traceroute${RESET}
"
yum install -y traceroute
printf "
${CYAN}>>> install iproute(ip、ss)${RESET}
"
yum install -y iproute
# 端口工具
printf "
${CYAN}>>> install lsof${RESET}
"
yum install -y lsof
printf "
${CYAN}>>> install nc${RESET}
"
yum install -y nc
printf "
${CYAN}>>> install netstat${RESET}
"
yum install -y netstat
# DNS工具
printf "
${CYAN}>>> install bind-utils(dig、host、nslookup)${RESET}
"
yum install -y bind-utils
printf "
${CYAN}>>> install whois${RESET}
"
yum install -y whois
# 下载工具
printf "
${CYAN}>>> install curl${RESET}
"
yum install -y curl
printf "
${CYAN}>>> install wget${RESET}
"
yum install -y wget
# 编辑工具
printf "
${CYAN}>>> install emacs${RESET}
"
yum install -y emacs
printf "
${CYAN}>>> install vim${RESET}
"
yum install -y vim
# 流量工具
printf "
${CYAN}>>> install iftop${RESET}
"
yum install -y iftop
printf "
${CYAN}>>> install nethogs${RESET}
"
yum install -y nethogs
# 抓包工具
printf "
${CYAN}>>> install tcpdump${RESET}
"
yum install -y tcpdump
# 压缩工具
printf "
${CYAN}>>> install unzip${RESET}
"
yum install -y unzip
# 版本控制工具
printf "
${CYAN}>>> install git${RESET}
"
yum install -y git
printf "
${CYAN}>>> install subversion${RESET}
"
yum install -y subversion
printf "
${GREEN}<<<<<<<<<< 安装常用命令工具结束${RESET}
"

Common Libraries Installation Script (常用lib库安装)

#!/usr/bin/env bash
# 控制台颜色
BLACK="\033[1;30m"
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
BLUE="\033[1;34m"
PURPLE="\033[1;35m"
CYAN="\033[1;36m"
RESET="$(tput sgr0)"

printf "${BLUE}
"
cat << EOF
###################################################################################
# 安装常见 lib
# 如果不知道命令在哪个 lib,可以使用 yum search xxx 来查找
# lib 清单如下:
# gcc gcc-c++ kernel-devel libtool
# openssl openssl-devel
# zlib zlib-devel
# pcre
###################################################################################
EOF
printf "${RESET}
"
printf "
${GREEN}>>>>>>>>>> 安装常见 lib 开始${RESET}
"
# gcc、gcc-c++、kernel-devel、libtool
printf "
${CYAN}>>> install gcc gcc-c++ kernel-devel libtool${RESET}
"
yum -y install make gcc gcc-c++ kernel-devel libtool
# openssl、openssl-devel
printf "
${CYAN}>>> install openssl openssl-devel${RESET}
"
yum -y install make openssl openssl-devel
# zlib、zlib-devel
printf "
${CYAN}>>> install zlib zlib-devel${RESET}
"
yum -y install make zlib zlib-devel
# pcre
printf "
${CYAN}>>> install pcre${RESET}
"
yum -y install pcre
printf "
${GREEN}<<<<<<<<<< 安装常见 lib 结束${RESET}
"

System Check Script (系统检查脚本)

#!/usr/bin/env bash
##############################################################################
# console color
C_RESET="$(tput sgr0)"
C_BLACK="\033[1;30m"
C_RED="\033[1;31m"
C_GREEN="\033[1;32m"
C_YELLOW="\033[1;33m"
C_BLUE="\033[1;34m"
C_PURPLE="\033[1;35m"
C_CYAN="\033[1;36m"
C_WHITE="\033[1;37m"
##############################################################################

printf "${C_PURPLE}"
cat << EOF
###################################################################################
# 系统信息检查脚本
###################################################################################
EOF
printf "${C_RESET}"

[[ $(id -u) -gt 0 ]] && echo "请用root用户执行此脚本!" && exit 1
sysversion=$(rpm -q centos-release | cut -d- -f3)

double_line="==============================================================="
line="----------------------------------------------"

# 打印头部信息
printHeadInfo(){
  cat << EOF
+---------------------------------------------------------------------------------+
|                           欢迎使用 【系统信息检查脚本】                          |
+---------------------------------------------------------------------------------+
EOF
}

# 打印尾部信息
printFootInfo(){
  cat << EOF
+---------------------------------------------------------------------------------+
|                            脚本执行结束,感谢使用!| 
+---------------------------------------------------------------------------------+
EOF
}

options=( "获取系统信息" "获取服务信息" "获取CPU信息" "获取系统网络信息" "获取系统内存信息" "获取系统磁盘信息" "获取CPU/内存占用TOP10" "获取系统用户信息" "输出所有信息" "退出" )

printMenu(){
  printf "${C_BLUE}"
  printf "主菜单:
"
  for i in "${!options[@]}"; do
    index=$((i+1))
    val=$((index % 2))
    printf "\t(%02d) %-30s" "$index" "${options[$i]}"
    if [ $val -eq 0 ]; then
      printf "
"
    fi
  done
  printf "${C_BLUE}请输入需要执行的指令:
"
  printf "${C_RESET}"
}

# 获取系统信息
get_systatus_info(){
    sys_os=$(uname -o)
    sys_release=$(cat /etc/redhat-release)
    sys_kernel=$(uname -r)
    sys_hostname=$(hostname)
    sys_selinux=$(getenforce)
    sys_lang=$LANG
    sys_lastreboot=$(who -b | awk '{print $3,$4}')
    sys_runtime=$(uptime | awk '{print $3,$4}' | cut -d, -f1)
    sys_time=$(date)
    sys_load=$(uptime | cut -d: -f5)
    cat << EOF
【系统信息】
系统: $sys_os
发行版本: $sys_release
系统内核: $sys_kernel
主机名: $sys_hostname
selinux状态: $sys_selinux
系统语言: $sys_lang
系统当前时间: $sys_time
系统最后重启时间: $sys_lastreboot
系统运行时间: $sys_runtime
系统负载: $sys_load
EOF
}

# 获取CPU信息
get_cpu_info(){
    Physical_CPUs=$(grep "physical id" /proc/cpuinfo | sort | uniq | wc -l)
    Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l)
    CPU_Kernels=$(grep "cores" /proc/cpuinfo | uniq | awk -F ': ' '{print $2}')
    CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
    CPU_Arch=$(uname -m)
    cat << EOF
【CPU信息】
物理CPU个数:$Physical_CPUs
逻辑CPU个数:$Virt_CPUs
每CPU核心数:$CPU_Kernels
CPU型号:$CPU_Type
CPU架构:$CPU_Arch
EOF
}

# 获取服务信息
get_service_info(){
    port_listen=$(netstat -lntup | grep -v "Active Internet")
    kernel_config=$(sysctl -p 2>/dev/null)
    if [[ $sysversion -gt 6 ]]; then
        service_config=$(systemctl list-unit-files --type=service --state=enabled | grep "enabled")
        run_service=$(systemctl list-units --type=service --state=running | grep ".service")
    else
        service_config=$(/sbin/chkconfig | grep -E ":on|:启用" | column -t)
        run_service=$(/sbin/service --status-all | grep -E "running")
    fi
    cat << EOF
【服务信息】
${service_config}
${line}
运行的服务:
${run_service}
${line}
监听端口:
${port_listen}
${line}
内核参考配置:
${kernel_config}
EOF
}

# 获取系统内存信息
get_mem_info(){
    check_mem=$(free -m)
    MemTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    MemFree=$(grep MemFree /proc/meminfo | awk '{print $2}')
    let MemUsed=MemTotal-MemFree
    MemPercent=$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf \"%.2f\",$MemUsed*100/$MemTotal}}")
    report_MemTotal="$((MemTotal/1024)) MB"
    report_MemFree="$((MemFree/1024)) MB"
    report_MemUsedPercent=$(free | sed -n '2p' | gawk '{x = int(( $3 / $2 ) * 100) ; print x "%"}')
    cat << EOF
【内存信息】
内存总容量(MB): $report_MemTotal
内存剩余量(MB): $report_MemFree
内存使用率: $report_MemUsedPercent
EOF
}

# 获取系统网络信息
get_net_info(){
    pri_ipadd=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
    pub_ipadd=$(curl ifconfig.me -s)
    gateway=$(ip route | grep default | awk '{print $3}')
    mac_info=$(ip link | egrep -v "lo" | grep link | awk '{print $2}')
    dns_config=$(egrep -v "^$|^#" /etc/resolv.conf)
    route_info=$(route -n)
    cat << EOF
【网络信息】
系统公网地址:$pub_ipadd
系统私网地址:$pri_ipadd
网关地址:$gateway
MAC地址:$mac_info
路由信息:
${route_info}
DNS 信息:
${dns_config}
EOF
}

# 获取系统磁盘信息
get_disk_info(){
    disk_info=$(fdisk -l | grep "Disk /dev" | cut -d, -f1)
    disk_use=$(df -hTP | awk '$2!="tmpfs"{print}')
    disk_percent=$(free | sed -n '2p' | gawk '{x = int(( $3 / $2 ) * 100) ; print x "%"}')
    disk_inode=$(df -hiP | awk '$1!="tmpfs"{print}')
    cat << EOF
【磁盘信息】
${disk_info}
磁盘使用: $disk_use
磁盘使用百分比: $disk_percent
inode信息: $disk_inode
EOF
}

# 获取系统用户信息
get_sys_user(){
    login_user=$(awk -F: '{if ($NF=="/bin/bash") print $0}' /etc/passwd)
    ssh_config=$(egrep -v "^#|^$" /etc/ssh/sshd_config)
    sudo_config=$(egrep -v "^#|^$" /etc/sudoers | grep -v "^Defaults")
    host_config=$(egrep -v "^#|^$" /etc/hosts)
    crond_config=$(for cronuser in /var/spool/cron/*; do ls ${cronuser} 2>/dev/null | cut -d/ -f5; egrep -v "^$|^#" ${cronuser} 2>/dev/null; echo ""; done)
    cat << EOF
【用户信息】
系统登录用户:
${login_user}
${line}
ssh 配置信息:
${ssh_config}
${line}
sudo 配置用户:
${sudo_config}
${line}
定时任务配置:
${crond_config}
${line}
hosts 信息:
${host_config}
EOF
}

# 获取CPU/内存占用TOP10
get_process_top_info(){
    top_title=$(top -b -n 1 | head -7 | tail -1)
    cpu_top10=$(top -b -n 1 | head -17 | tail -11)
    mem_top10=$(top -b -n 1 | head -17 | tail -10 | sort -k10 -r)
    cat << EOF
【TOP10】
CPU占用TOP10:
${cpu_top10}
内存占用TOP10:
${top_title}
${mem_top10}
EOF
}

show_dead_process(){
    printf "僵尸进程:
"
    ps -al | gawk '{print $2,$4}' | grep Z
}

get_all_info(){
    get_systatus_info
    echo $double_line
    get_service_info
    echo $double_line
    get_cpu_info
    echo $double_line
    get_net_info
    echo $double_line
    get_mem_info
    echo $double_line
    get_disk_info
    echo $double_line
    get_process_top_info
    echo $double_line
    get_sys_user
}

main(){
    while true; do
        printMenu
        read option
        index=$((option-1))
        case "${options[$index]}" in
            "获取系统信息") get_systatus_info ;;
            "获取服务信息") get_service_info ;;
            "获取CPU信息") get_cpu_info ;;
            "获取系统网络信息") get_net_info ;;
            "获取系统内存信息") get_mem_info ;;
            "获取系统磁盘信息") get_disk_info ;;
            "获取CPU/内存占用TOP10") get_process_top_info ;;
            "获取系统用户信息") get_sys_user ;;
            "输出所有信息") get_all_info > sys.log; printf "${C_GREEN}信息已经输出到 sys.log 中。${C_RESET}

" ;;
            "退出") exit ;;
            *) clear; echo "抱歉,不支持此选项" ;;
        esac
    done
}

printHeadInfo
main
printFootInfo
printf "${C_RESET}"

Sed Advanced Examples (sed进阶)

#!/bin/bash
# 多个空格只保留一个
# sed '/./,/^$/!d' test

# 删除开头的空白行
# sed '/./,$!d' test

# 删除结尾的空白行
sed '{
:start
/^
*$/{$d; N; b start}
}' test

# 删除 html 标签(有问题)
# s/<.*>//g
sed 's/<[^>]*>//g' test1
sed 's/<[^>]*>//g;/^$/d' test1

# and 符号示例,提取匹配字符串并加引号
echo "The cat sleeps in his hat" | sed 's/.at/"&"/g'

# 替换单独的单词
echo "The System Administrator manual" | sed 's/\(System\) Administrator/\1 user/'

# 在长数字中插入逗号
echo "1234567" | sed '{:start; s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/; t start}'

# 给文件中的行编号
sed '=' test | sed 'N; s/
/ /'
Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

Linux
Open Source Linux
Written by

Open Source Linux

Focused on sharing Linux/Unix content, covering fundamentals, system development, network programming, automation/operations, cloud computing, and related professional knowledge.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.