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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章