Demo
一些bash的例子:
在bash中设置异常捕获,监控循环中可能发生的错误
#!/bin/bash
# 可以捕获失败的循环,把错误的循环次数打印在fail.txt中
set -E
> fail.txt
trap 'echo $i >> fail.txt' ERR
for ((i=1; i<=10; i++)); do
sleep 2s
echo "This is iteration number $i"
ls demo_dir
done
echo "end"
通过带内IP地址计算带外IP地址
#!/bin/bash
#提供带内ip列表,输出一个对应的带外ip的列表
if [ $# -ne 1 ]; then
echo "错误:请提供输入ip列表文件,输出带外ip列表文件:[文件]_ipm.txt"
exit 1
fi
input_file=$1
output_file="${1}_ipm.txt"
# 确保输出文件是空的
> "$output_file"
# 读取每一行 IP 地址并处理
while IFS= read -r ip; do
# 分割 IP 地址,取最后一段数字
base_ip=$(echo "$ip" | awk -F'.' '{print $1"."$2"."$3"."}')
last_octet=$(echo "$ip" | awk -F'.' '{print $4}')
# 计算新的最后一段数字
new_last_octet=$((last_octet + 128))
# 生成新的 IP 地址并写入输出文件
echo "${base_ip}${new_last_octet}" >> "$output_file"
done < "$input_file"
echo "处理完成!新的 IP 地址已保存到 $output_file"
可以显示目录中,最近有变化的10个日志,并按照距离最近的时间进行排序
#!/bin/bash
# 检查是否提供了目录路径
if [ -z "$1" ]; then
echo "Usage: $0 <directory>"
exit 1
fi
TARGET_DIR="$1"
NUM_LOGS=10
# 检查目录是否存在
if [ ! -d "$TARGET_DIR" ]; then
echo "Error: Directory '$TARGET_DIR' does not exist."
exit 1
fi
# 使用 find 查找 .log 文件,获取修改时间并排序,输出最近的文件
find "$TARGET_DIR" -type f -name "*.log" -printf "%T@ %p\n" | \
sort -nr | \
head -n "$NUM_LOGS" | \
while read -r line; do
timestamp=$(echo "$line" | awk '{print $1}')
filepath=$(echo "$line" | awk '{$1=""; print $0}' | sed 's/^ //')
datetime=$(date -d @"$timestamp" +"%Y-%m-%d %H:%M:%S")
echo "$filepath - Last Modified: $datetime"
done
#!/bin/bash
find "$1" -type f -name "*.log" -printf "%T@ %p\n" | sort -nr | head -n 10 | awk '{cmd = "date -d @"$1" +\"%Y-%m-%d %H:%M:%S\""; cmd | getline t; close(cmd); print $2, "- Last Modified:", t}'
输出 a.txt
中所有包含 b.txt
中某行内容的行
grep -F -f b.txt a.txt
批量从文件中查找内容,并显示文件名称
grep -rnw '/path/to/lists/' -e '192.168.1.1'
批量把txt文件修改成list 文件
for file in *.txt; do
mv "$file" "${file%.txt}.list"
done
远程执行命令,提供一个主机列表,命令行后输入需要执行的命令
#!/bin/bash
# 检查参数
if [ "$#" -lt 2 ]; then
echo "用法: $0 <machine_list_file> <command>"
exit 1
fi
MACHINE_LIST="$1"
shift
COMMAND="$@"
USERNAME="root" # SSH 用户名,请修改为实际的用户名
PASSWORD="centos" # 你可以修改为从环境变量或安全方式获取密码
# 检查 sshpass 是否安装
if ! command -v sshpass &> /dev/null; then
echo "sshpass 未安装,请先安装它 (例如:apt install sshpass 或 yum install sshpass)"
exit 1
fi
# 读取机器列表并执行命令(串行执行,保证顺序)
for HOST in $(cat "$MACHINE_LIST"); do
echo -n "正在连接 $HOST :"
sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectTimeout=3 "$USERNAME@$HOST" "$COMMAND"
done
echo "所有命令执行完毕。"
linux有个目录,我想删除除了以.sh结尾其他的文件
find ./ -type f ! -name "*.sh" -exec rm -f {} +
linux有个目录,我想删除除了以.sh和.bin结尾其他的文件
find ./ -type f ! -name "*.sh" ! -name "*.bin" | xargs rm -f
linux有个目录,我想删除除了以.sh,.bin,.gz,.jar结尾其他的文件,仅操作文件,不处理目录,仅处理一级目录中文件
find ./ -maxdepth 1 -type f ! -name "*.sh" ! -name "*.bin" ! -name "*.gz" ! -name "*.jar" | xargs rm -rf
find ./ -type f -name '日志.log.2025*' ! -name '日志.log.20250304*' -exec rm {} +
find ./ -type f -name '日志.log.2025*' ! -name '日志.log.20250314*' -exec ls -l {} +
du -ah --max-depth=1 ./ | sort -rh | head -n 20