跳到主要内容

3、登录系统自动显示系统信息脚本

登录系统自动显示系统信息脚本

背景

今天给大家安利一个超级实用的Linux小技巧,让你每次登录终端时都能感受到满满的科技感和效率爆棚!

你是否厌倦了每次手动检查系统状态,像内存使用、CPU负载这些繁琐操作?别担心,一个小调整,让这一切自动化!

你只需要将这个脚本放置在/etc/profile.d/目录下,并授权可执行权限,下次登录系统时,就会自动显示系统基本信息了,如下:

image-20240729053813988

使用方法

#上传脚本到/root目录
cd /root
cp systeminfo-v2-2024.7.28.sh /etc/profile.d/
chmod +x /etc/profile.d/systeminfo-v2-2024.7.28.sh

测试效果:

image-20240728082447695

脚本位置

通过百度网盘分享的文件:登录系统自动显示系统信息脚本 链接:https://pan.baidu.com/s/1NcuV0gyB6E__GQTolkglOg?pwd=sx1d 提取码:sx1d systeminfo-v3-2024.7.28.sh

image-20240729054850781

版本更新

v1(初始版本)(存在问题)

systeminfo.sh

#!/bin/bash
# by 运维朱工
# site:bash.lutixia.cn
######################



# 获取IP地址和主机名
IP_ADDR=$(hostname -I | cut -d' ' -f1)
HOSTNAME=$(hostname)

# CPU负载信息:
cpu_load() {
echo -e "\t\t\tcpu的负载情况"
echo -e "\t------------------------------------------------"
echo -e "\tCPU load in 1 min is: `awk '{printf "%15s",$1}' /proc/loadavg`"
echo -e "\tCPU load in 5 min is: `awk '{printf "%15s",$2}' /proc/loadavg`"
echo -e "\tCPU load in 10 min is: `awk '{printf "%15s",$3}' /proc/loadavg`"
echo
}

# mem基本信息:
memory_info() {
echo -e "\t\t\t内存的使用情况"
echo -e "\t------------------------------------------------"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
echo
}

# 磁盘使用量排序:
disk_rank() {
echo -e "\t\t\t各分区使用率"
echo -e "\t------------------------------------------------"
df -h -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
echo
}





# 显示系统信息
echo
echo -e "\t\t\t系统基本信息:"
echo -e "\t------------------------------------------------"
echo -e "\tCurrent Time : $(date)"
echo -e "\tVersion : $(cat /etc/os-release | grep -w "PRETTY_NAME" | cut -d= -f2 | tr -d '"')"
echo -e "\tKernel : $(uname -r)"
echo -e "\tUptime : $(uptime -p)"
echo -e "\tIP addr : $IP_ADDR"
echo -e "\tHostname : $HOSTNAME"
echo -e "\tCpu : $(lscpu | grep "Model name:" | sed 's/Model name:\s*//')"
echo -e "\tMemory : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
echo -e "\tSWAP : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"
echo -e "\tUsers Logged : $(who | wc -l) users"
echo

cpu_load
memory_info
disk_rank

存在问题如下:

image-20240728152531620

image-20240728152557004

脚本说明:

v2-2024.7.28

cd /etc/profile.d/
vim systeminfo-v2.sh

chmod +x systeminfo-v2-2024.7.28.sh

image-20240728082447695

systeminfo-v2-2024.7.28.sh

#!/bin/bash
# by One
# site:onedayxyy.cn
# 更新于:2024年7月28日
######################


# 检查是否为交互式 shell
if [[ $- != *i* ]]; then
return
fi


# 获取IP地址和主机名
IP_ADDR=$(hostname -I | cut -d' ' -f1)
HOSTNAME=$(hostname)

# CPU负载信息:
cpu_load() {
echo -e "\t\t\tcpu的负载情况"
echo -e "\t------------------------------------------------"
echo -e "\tCPU load in 1 min is: `awk '{printf "%15s",$1}' /proc/loadavg`"
echo -e "\tCPU load in 5 min is: `awk '{printf "%15s",$2}' /proc/loadavg`"
echo -e "\tCPU load in 10 min is: `awk '{printf "%15s",$3}' /proc/loadavg`"
echo
}

# mem基本信息:
memory_info() {
echo -e "\t\t\t内存的使用情况"
echo -e "\t------------------------------------------------"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
echo
}

# 磁盘使用量排序:
disk_rank() {
echo -e "\t\t\t各分区使用率"
echo -e "\t------------------------------------------------"
df -h -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
echo
}

# 显示系统信息
echo
echo -e "\t\t\t系统基本信息:"
echo -e "\t------------------------------------------------"
echo -e "\tCurrent Time : $(date)"
echo -e "\tVersion : $(cat /etc/os-release | grep -w "PRETTY_NAME" | cut -d= -f2 | tr -d '"')"
echo -e "\tKernel : $(uname -r)"
echo -e "\tUptime : $(uptime -p)"
echo -e "\tIP addr : $IP_ADDR"
echo -e "\tHostname : $HOSTNAME"
echo -e "\tCpu : $(lscpu | grep "Model name:" | sed 's/Model name:\s*//')"
echo -e "\tMemory : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
echo -e "\tSWAP : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"
echo -e "\tUsers Logged : $(who | wc -l) users"
echo

cpu_load
memory_info
disk_rank

脚本说明

==检查是否为交互式 shell==

# 检查是否为交互式 shell
if [[ $- != *i* ]]; then
return
fi
  • 这段代码检查当前shell是否为交互式shell。如果不是交互式shell,脚本会直接返回,避免在非交互式shell环境中执行,从而不会干扰其他服务的正常运行。

详细解释:

这段代码用于检查当前的 shell 是否为交互式 shell。以下是对这段代码的详细解释:

# 检查是否为交互式 shell
if [[ $- != *i* ]]; then
return
fi
  1. $- 变量

    • $- 是一个特殊的 shell 变量,它包含了当前 shell 的选项标志。这些选项标志是在启动 shell 时设置的,或者是在 shell 运行过程中通过 set 命令设置的。
    • 例如,$- 可能包含的选项有 i(交互式)、v(详细模式)、x(追踪模式)等。
  2. [[ ... ]] 条件测试

    • [[ ... ]] 是 Bash 中的一个条件测试结构,用于执行条件判断。
    • $- != *i* 是一个字符串匹配表达式,用于检查 $- 变量中是否包含字符 i
  3. *i* 模式

    • *i* 是一个通配符模式,其中 * 表示任意字符(包括零个字符),i 是要匹配的字符。
    • 因此,$- != *i* 的意思是:如果 $- 变量中不包含字符 i,则条件为真。
  4. if ... then ... fi 结构

    • 如果条件为真(即 $- 变量中不包含字符 i),则执行 then 块中的代码。
    • 在这个例子中,then 块中的代码是 return表示从当前函数或脚本中返回,不再执行后续的代码。
  5. return 命令

    • return 命令用于从当前函数或脚本中退出。如果在一个脚本中使用 return,它会立即停止脚本的执行。

总结

这段代码的目的是确保脚本只在交互式 shell 中运行。如果当前 shell 不是交互式 shell(即 $- 变量中不包含字符 i),脚本会立即返回,不再执行后续的代码。这样可以避免脚本在非交互式环境中(例如在后台任务或某些自动化脚本中)产生不必要的输出或干扰其他进程。

v3-2024.7.28(最新)(增加颜色为红色)

#!/bin/bash
#
#********************************************************************
#Author: hg
#QQ: 2675263825
#Date: 2024-7-29
#FileName: systeminfo-2024.1.1.sh
#URL: http://onedayxyy.cn
#Description: Show system information
#Copyright (C): 2024 All rights reserved
#********************************************************************


# 检查是否为交互式 shell
if [[ $- != *i* ]]; then
return
fi

#配置颜色
RED="\E[1;31m"
GREEN="echo -e \E[1;32m"
END="\E[0m"


# 获取IP地址和主机名
IP_ADDR=$(hostname -I | cut -d' ' -f1)
HOSTNAME=$(hostname)

# CPU负载信息:
cpu_load() {
echo -e "\t\t\tcpu的负载情况"
echo -e "\t------------------------------------------------"
echo -e "\tCPU load in 1 min is: $RED`awk '{printf "%15s",$1}' /proc/loadavg`$END"
echo -e "\tCPU load in 5 min is: $RED`awk '{printf "%15s",$2}' /proc/loadavg`$END"
echo -e "\tCPU load in 10 min is: $RED`awk '{printf "%15s",$3}' /proc/loadavg`$END"
echo
}

# mem基本信息:
memory_info() {
echo -e "\t\t\t内存的使用情况"
echo -e "\t------------------------------------------------"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
echo
}

# 磁盘使用量排序:
disk_rank() {
echo -e "\t\t\t各分区使用率"
echo -e "\t------------------------------------------------"
df -h -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
echo
}

# 显示系统信息
echo
echo -e "\t\t\t系统基本信息:"
echo -e "\t------------------------------------------------"
echo -e "\tCurrent Time : $RED $(date) $END"
echo -e "\tVersion : $RED $(cat /etc/os-release | grep -w "PRETTY_NAME" | cut -d= -f2 | tr -d '"') $END"
echo -e "\tKernel : $RED $(uname -r) $END"
echo -e "\tUptime : $RED $(uptime -p) $END"
echo -e "\tIP addr : $RED $IP_ADDR $END"
echo -e "\tHostname : $RED $HOSTNAME $END"
echo -e "\tCpu : $RED $(lscpu | grep "Model name:" | sed 's/Model name:\s*//') $END"
echo -e "\tMemory : $RED $(free -h | awk '/^Mem:/ { print $3 "/" $2 }') $END"
echo -e "\tSWAP : $RED $(free -h | awk '/^Swap:/ { print $3 "/" $2 }') $END"
echo -e "\tDisk : $RED $(lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4) $END"
echo -e "\tUsers Logged : $RED $(who | wc -l) users $END"
echo

cpu_load
memory_info
disk_rank

效果:

image-20240729053813988

命令汇总

获取IP地址和主机名

# 获取IP地址和主机名
IP_ADDR=$(hostname -I | cut -d' ' -f1)
HOSTNAME=$(hostname)

echo $IP_ADDR
echo $HOSTNAME


或者
[root@I ~]# ifconfig eth0|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1
172.26.4.24
  • IP_ADDR:获取系统的第一个IP地址。
  • HOSTNAME:获取系统的主机名。

image-20240728215022943

image-20240729054334708

CPU负载信息

# CPU负载信息:
cpu_load() {
echo -e "\t\t\tcpu的负载情况"
echo -e "\t------------------------------------------------"
echo -e "\tCPU load in 1 min is: `awk '{printf "%15s",$1}' /proc/loadavg`"
echo -e "\tCPU load in 5 min is: `awk '{printf "%15s",$2}' /proc/loadavg`"
echo -e "\tCPU load in 10 min is: `awk '{printf "%15s",$3}' /proc/loadavg`"
echo
}


cpu_load



##说明:
awk '{printf "%15s",$1}' /proc/loadavg
awk '{printf "%15s",$2}' /proc/loadavg
awk '{printf "%15s",$3}' /proc/loadavg




[root@I ~]# #查看cpu
[root@I ~]# lscpu|grep 'Model name'|tr -s ' '|cut -d : -f2
Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
  • cpu_load函数:显示CPU在过去1分钟、5分钟和10分钟内的负载情况。

image-20240728215530767


这段代码定义了一个名为 cpu_load 的函数,用于显示系统的 CPU 负载信息。以下是对这段代码的详细解释:

==函数定义==

cpu_load() {
  • cpu_load 是一个 Bash 函数,它用来封装一系列要执行的命令。
  • 函数名是 cpu_load,后面的花括号 {} 包围了函数体。

==输出标题和分隔线==

    echo -e "\t\t\tcpu的负载情况"
echo -e "\t------------------------------------------------"
  • echo -e:启用转义序列处理(例如 \t)。
  • \t\t\t:插入三个制表符,使输出内容向右缩进。
  • cpu的负载情况:这是要显示的标题。
  • \t------------------------------------------------:输出一条横线,用来分隔标题和内容。

==显示 CPU 负载信息==

    echo -e "\tCPU load in 1  min is: `awk  '{printf "%15s",$1}' /proc/loadavg`"
echo -e "\tCPU load in 5 min is: `awk '{printf "%15s",$2}' /proc/loadavg`"
echo -e "\tCPU load in 10 min is: `awk '{printf "%15s",$3}' /proc/loadavg`"
  • \t:插入一个制表符,使输出内容向右缩进。
  • CPU load in 1 min is::输出文本,表示接下来显示的是1分钟的负载信息。
  • `awk '{printf "%15s",$1}' /proc/loadavg`:通过嵌入的命令替换(用反引号包围的命令)获取和格式化 CPU 负载信息。
    • /proc/loadavg 文件:这是一个虚拟文件,包含了系统的平均负载信息。
    • 该文件的内容类似于: 0.00 0.01 0.05 1/234 5678其中前三个数值分别表示系统在过去1分钟、5分钟和10分钟内的平均负载
    • awk '{printf "%15s",$1}':使用 awk 命令从 /proc/loadavg 文件中提取第一个字段(即1分钟的负载),并格式化输出,使其占用15个字符宽度
  • 类似地,第二和第三行分别处理5分钟和10分钟的负载信息。
##说明:
awk '{printf "%15s",$1}' /proc/loadavg
awk '{printf "%15s",$2}' /proc/loadavg
awk '{printf "%15s",$3}' /proc/loadavg

#格式化输出,**使其占用15个字符宽度**。

==输出空行==

    echo
}
  • echo:输出一个空行,用来分隔不同部分的信息,增强可读性。
  • }:结束函数定义。

==总结==

这个函数的作用是读取并显示系统的 CPU 负载信息。具体来说,它读取 /proc/loadavg 文件中的数据,并分别提取和格式化过去1分钟、5分钟和10分钟的平均负载值,然后将这些信息打印到屏幕上。函数输出的内容是美化过的,包括标题、分隔线和适当的缩进,使其易于阅读。

内存基本信息

# mem基本信息:
memory_info() {
echo -e "\t\t\t内存的使用情况"
echo -e "\t------------------------------------------------"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
echo
}


memory_info




[root@I ~]# #查看内存
[root@I ~]# free -h|grep Mem|tr -s ' ' : |cut -d : -f2
3.5G
  • memory_info函数:显示内存的总容量、空闲容量和缓存情况。

image-20240728215919981

说明:

awk '/Mem/{printf "%-10s %s","内存总容量:",\$2}':使用 awk 命令过滤并格式化 free 命令的输出。

/Mem/:匹配包含 Mem 的行,这行通常包含内存的使用信息。
printf "%-10s %s","内存总容量:",\$2:格式化打印字符串,其中 %-10s 表示左对齐并占用10个字符宽度,\$2 表示第二列数据(内存总容量)。

磁盘使用量排序

案例

# 磁盘使用量排序:
disk_rank() {
echo -e "\t\t\t各分区使用率"
echo -e "\t------------------------------------------------"
df -h -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
echo
}


disk_rank



##提取磁盘大小
[root@I ~]# lsblk |grep '^vd' |tr -s ' ' |cut -d " " -f4
80G
  • disk_rank函数:显示各个分区的使用率,并按使用率从高到低排序。

image-20240810063455398

案例

Linux如何取出磁盘分区利用率

(1)tr -dc "[0-9\n]"用法:

[root@test ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 919540 0 919540 0% /dev
tmpfs 931552 0 931552 0% /dev/shm
tmpfs 931552 9816 921736 2% /run
tmpfs 931552 0 931552 0% /sys/fs/cgroup
/dev/mapper/centos-root 49250820 1718472 47532348 4% /
/dev/sda1 1038336 152564 885772 15% /boot
tmpfs 186312 0 186312 0% /run/user/0
[root@test ~]# df | tr -s ' '|cut -d' ' -f5 |tr -dc "[0-9\n]"
0
0
2
0
4
15
0

(2)tr -d '[:alpha:]'用法:

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

[root@test ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 919540 0 919540 0% /dev
tmpfs 931552 0 931552 0% /dev/shm
tmpfs 931552 9816 921736 2% /run
tmpfs 931552 0 931552 0% /sys/fs/cgroup
/dev/mapper/centos-root 49250820 1718472 47532348 4% /
/dev/sda1 1038336 152564 885772 15% /boot
tmpfs 186312 0 186312 0% /run/user/0
[root@test ~]# df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]' #[:alpha:] 代表所有字母

0
0
2
0
4
15
0
[root@test ~]#