linux bash脚本实践

文件的md5校验

#/bin/bash

genMd5Sum(){
    local pid_array=()

    for file in ./*
    do
        md5sum ${file} &
        pid_array+=("$!") # 将上一个进程id保存之pid_array
    done

    wait ${pid_array[@]} # 等待pid_array中的进程执行完毕
}

checkMd5Sum(){
    local pid_array=()

    for file in ./*.md5
    do
        md5sum -c ${file} &
        pid_array+=("$!")
    done
}

case $1 in
    gen)
    genMd5Sum
    ;;
    check)
    checkMd5Sum
    ;;
    *)
    echo "need action supply"
    ;;
esac

删除重复文件

#!/bin/bash

ls -lS --time-style=long-iso | awk 'BEGIN {

  getline; getline;  #忽略第一行,读入第二行

  name1=$8; size=$5

}

{  # 从第三行开始遍历

  name2=$8;

  if (size==$5)
  {

    "md5sum "name1 | getline; csum1=$1;

    "md5sum "name2 | getline; csum2=$1;

    if ( csum1==csum2 )  # 文件md5值和上一个相同则输出重复的两个文件名
    {

      print name1; print name2

    }
  };

  size=$5; name1=name2;

}' | sort -u > duplicate_files # 输出排序并打印至duplicate_files


# 将md5值相同的文件根据md5去重并按照文件名排序后输入到unique_files
cat duplicate_files | xargs -I {} md5sum {} | \

    sort | uniq -w 32 | awk '{ print $2 }' | \

    sort -u > unique_files

echo Removing..

# 将不同时在duplicate_files unique_files中的文件删除
comm duplicate_files unique_files -3 | tee /dev/stderr | xargs rm

echo Removed duplicates files successfully.

远程监控磁盘脚本

#!/usr/bin/env bash

# 监控变量IP_LIST中的磁盘使用情况, 使用率超过80%的磁盘记录日志为ALERT
logfile="diskusage.log"


if [[ -n $1 ]]
then

    logfile=$1
fi


user=$USER


IP_LIST="127.0.0.1 0.0.0.0" # 需要监控的机器列表, 空格分割


if [ ! -e ${logfile} ]   # 日志文件不存在时打印头部信息
then
    printf "%-20s %-16s %-9s %-8s %-6s %-6s %-6s %s\n" \
    "Date" "IP address" "Device" "Capacity" "Used" "Free" \
    "Percent" "Status" > ${logfile}
fi

(
    for ip in ${IP_LIST};    # 自动按空格分割遍历字符串
    do
     # 登录机器执行df -H命令, 获取以/dev/开头的行,写入临时文件(/tmp/$$.df),$$代表进程号
     ssh -o StrictHostKeyChecking=no ${user}@${ip} 'df -H' | grep ^/dev/ > /tmp/$$.df
     cur_date=$(date '+%Y-%m-%d.%H:%M:%S')  # 当前时间格式化输出
     while read line; # 从标准顺序读入每行
     do
         printf "[%-14s] %-14s " ${cur_date} ${ip}
         echo $line | \
         awk '{ printf("%-9s %-8s %-6s %-6s %-8s" ,$1,$2,$3,$4,$5); }'
         pusg=$(echo $line | egrep -o "[0-9]+%")
         pusg=${pusg/\%/};  # 删除%

         if [ ${pusg} -lt 80 ];
         then
            echo SAFE
         else
            echo ALERT
         fi

     done< /tmp/$$.df   # 将$$.df重定向至while循环的标准输入

    done
) >> ${logfile} # 最终的输出全部重定向至logfile

用户登录情况统计

#!/usr/bin/env bash

# 获取各个用户登录次数&时长&第一次登录时间,并按照时长排序
log=/var/log/wtmp

if [[ -n $1 ]];

then
    log=$1
fi

printf "%-4s %-10s %-10s %-6s %-8s\n" "Rank" "User" "Start" "Logins" "Usage hours"

# 除最后两行外均打印至/tmp/ulog.$$
	last -f ${log} | head -n -2 > /tmp/ulog.$$

cat /tmp/ulog.$$ | cut -d' ' -f1 | sort | uniq> /tmp/users.$$ # 按照用户名排序并去重,保存至/tmp/users.$$

(

    while read user;
    do

        grep ^${user} /tmp/ulog.$$ > /tmp/user.$$  # 获取本user的访问信息
        minutes=0
        while read t
        do
            s=$(echo ${t} | awk -F: '{ print ($1 * 60) + $2 }') # 计算登录持续时长
            let minutes=minutes+s
        # 获取访问信息的最后一列(登录持续时间),并去掉(),最后将输出重定向至while done
        done< <(cat /tmp/user.$$ | awk '{ print $NF }' | tr -d ')(')

        firstlog=$(tail -n 1 /tmp/user.$$ | awk '{ print $5,$6 }') # 第一次登录时间

        nlogins=$(cat /tmp/user.$$ | wc -l) # 登录次数
        hours=$(echo "$minutes / 60.0" | bc)  # 登录持续时长
        printf "%-10s %-10s %-6s %-8s\n" ${user} "${firstlog}" ${nlogins} ${hours}

    done< /tmp/users.$$

) | sort -nrk 4 | awk '{ printf("%-4s %s\n", NR, $0) }' # 按照登录时长排序并打印排序

rm /tmp/users.$$ /tmp/user.$$ /tmp/ulog.$$

bash中对mysql进行操作

#!/bin/bash

# bash中对mysql进行操作
USER="user"
PASS="user"
HOST="127.0.0.1"

mysql -u ${USER} -p${PASS} -h${HOST}<<EOF 2> /dev/null
CREATE DATABASE students;
EOF

[ $? -eq 0 ] && echo Created DB || echo DB already exist

mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
CREATE TABLE students(
id int,
name varchar(100),
score int
);
EOF

[ $? -eq 0 ] && echo Created table students || echo Table students already exist

mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
INSERT INTO students(id,name,score)values(0,'allen',100);
);
EOF

mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
SELECT * FROM students WHERE id=0;
EOF

mysql -u ${USER} -p${PASS} -h${HOST} students <<EOF 2> /dev/null
DROP TABLE students;
EOF

mysql -u ${USER} -p${PASS} -h${HOST} <<EOF 2> /dev/null
DROP DATABASE students;
EOF
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章