前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux运维常用shell脚本之文件和字符串管理实例

Linux运维常用shell脚本之文件和字符串管理实例

作者头像
菲宇
发布2022-12-02 14:54:39
4620
发布2022-12-02 14:54:39
举报
文章被收录于专栏:菲宇菲宇

1、判断输入是否为数字

方法1:
if [[ $1 =~ ^[0-9]+$ ]]; then
    echo "Is Number."
else
    echo "No Number."
fi
方法2:
if [ $1 -gt 0 ] 2>/dev/null; then
    echo "Is Number."
else
    echo "No Number."
fi

方法3:

echo $1 |awk '{print $0~/^[0-9]+$/?"Is Number.":"No Number."}'  #三目运算符
DIR=$1
KEY=$2
for FILE in $(find $DIR -type f); do
    if grep $KEY $FILE &>/dev/null; then
        echo "--> $FILE"
    fi
done

2、 将目录下大于k的文件转移出去

编写shell脚本,将/usr/local/test目录下大于100k的文件转移到/tmp目录下:

#!/bin/bash
for FILE in `ls /usr/local/test`
do
    if [ -f $FILE ] ; then
        if [ `ls -l  $FILE | awk `{print $5}` -gt 100000 ] ; then
            mv $FILE  /tmp/
        fi
    fi
done

================

#!/bin/bash
for FileName in `ls -l  /usr/local/test | awk '$5>102400' {print $9}`
do
        mv $FileName  /tmp/
done
ls -al  /tmp/
echo  "done!"

3、批量修改文件名

# touch article_{1..3}.html

# ls

article_1.html  article_2.html  article_3.html

现在想把article改为bbs:

方法1:

for file in $(ls *html); do

    mv $file bbs_${file#*_}

    # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')

    # mv $file $(echo $file |echo bbs_$(cut -d_ -f2) 

done

方法2:

for file in $(find . -maxdepth 1 -name "*html"); do

     mv $file bbs_${file#*_}

done

方法3:

# rename article bbs *.html

4、ftp自动登录批量下载文件

##### 从ftp服务器上的/home/data 到 本地的/home/databackup####
#!/bin/bash
ftp -n<<!
open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
mget *
close
bye
!

5、ftp自动登录上传文件

####本地的/home/databackup to ftp服务器上的/home/data####
#!/bin/bash
ftp -n<<!
open 192.168.1.171
user guest 123456
binary
hash
cd /home/data
lcd /home/databackup
prompt
mput *
close
bye
!

6、ftp自动登录下载单个文件

####ftp服务器上下载/home/data/a.sh to local /home/databackup####
#!/bin/bash
ftp -n<<!
open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
get a.sh a.sh
close
bye
!

7、ftp自动登录上传单个文件

####把本地/home/databachup/a.sh up ftp /home/databackup 下####
#!/bin/bash
ftp -n<<!
open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
put a.sh a.sh
close
bye
!

8、监控目录,将新创建的文件名追加到日志中

需安装inotify-tools软件包。

#!/bin/bash
MON_DIR=/opt
inotifywait -mq --format %f -e create $MON_DIR |\
while read files; do
  echo $files >> test.log
done
12.16 多个网卡选择
function local_nic() {
    local NUM ARRAY_LENGTH
    NUM=0
    for NIC_NAME in $(ls /sys/class/net|grep -vE "lo|docker0"); do
        NIC_IP=$(ifconfig $NIC_NAME |awk -F'[: ]+' '/inet addr/{print $4}')
        if [ -n "$NIC_IP" ]; then
            NIC_IP_ARRAY[$NUM]="$NIC_NAME:$NIC_IP"    #将网卡名和对应IP放到数组
            let NUM++
        fi
    done
    ARRAY_LENGTH=${#NIC_IP_ARRAY[*]}
    if [ $ARRAY_LENGTH -eq 1 ]; then     #如果数组里面只有一条记录说明就一个网卡
        NIC=${NIC_IP_ARRAY[0]%:*}
        return 0
    elif [ $ARRAY_LENGTH -eq 0 ]; then   #如果没有记录说明没有网卡
        echo "No available network card!"
        exit 1
    else
        #如果有多条记录则提醒输入选择
        for NIC in ${NIC_IP_ARRAY[*]}; do
            echo $NIC
        done
        while true; do
            read -p "Please enter local use to network card name: " INPUT_NIC_NAME
            COUNT=0
            for NIC in ${NIC_IP_ARRAY[*]}; do
                NIC_NAME=${NIC%:*}
                if [ $NIC_NAME == "$INPUT_NIC_NAME" ]; then
                    NIC=${NIC_IP_ARRAY[$COUNT]%:*}
                    return 0
                else
                   COUNT+=1
                fi
            done
            echo "Not match! Please input again."
        done
    fi
}
local_nic

如果有只有一个网卡就不选择。

9、监控LINUX目录和文件变化

利用一个脚本能够实时监控web目录下文件的变化,也就是对该目录的增删改操作都会记录到相应日志下。

主要有两个脚本:

脚本1:将需要监控的目录的原始状态保存到LOG日志 脚本2:将脚本1的原始状态与本脚本比对,如果目录文件发生变化,则将变化的内容保存到日志。

1,监控 /home/www/ 目录改动,并将改动的文件rsync到/home/www3目录

2,监控方法为监控文件的md5值,如果md5值与上次不同,即发生改变

注:原理实际上利用的是du -sb输出值来判断文件的变化,再利用diff进行比对。

1.在执行脚本前要保存原始的状态:

# vi initial.sh

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin/:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 监控的目录
DIR=/root
# 临时文件
TMP_A=/tmp/a.txt
# 遍历指定目录下的文件大小及路径并重定向到日志文件
find $DIR -print0 | xargs -0 du -sb  > $TMP_A

2.执行监控脚本 # vi monitor.sh

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin/:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 监控的目录
DIR=/root
# 日期变量
DATE=`date +%F_%H:%M`
# 临时文件
TMP_A=/tmp/a.txt
TMP_B=/tmp/b.txt
TMP_C=/tmp/c.txt
# 日志文件
LOG=/var/log/filemodify.log
# 遍历指定目录下的文件大小及路径并重定向到日志文件
find $DIR -print0 | xargs -0 du -sb  > $TMP_B
# 比较目录变化,并将变化的文件写入日志
DIFF=$(diff $TMP_A $TMP_B)
if [[ -z $DIFF ]];
 then
   echo "Nothing change" >> $LOG
 else
   echo "Here is the change" >> $LOG
   echo "" >> $LOG
   echo "$DIFF" |awk '{print $3}'|sort -k2n |uniq |sed '/^$/d' |tee $TMP_C >> $LOG
   if [ -s $TMP_C ];
     then
       echo "" >> $LOG
       echo "It modified at $DATE" >> $LOG
# 将当前监控的目录结构覆盖为初始状态
       find $DIR -print0 | xargs -0 du -sb  > $TMP_A
   fi
fi
echo "====================================" >> $LOG
#清理临时文件
rm -rf $TMP_B $TMP_C

Shell脚本监控目录内文件改动

#! /bin/bash
webroot="/home/www/"
cp /dev/null rsync_file
if [ ! -f file.md5 ];then
  find $webroot -type f -exec md5sum {} \; >>file.md5
else
  for file in $(md5sum -c file.md5|awk -F':' '/FAILED/{print $1}')
    do
      if [ -f $file ];then
      filename_z=$(echo $file|sed 's#/#\\/#g')
      sed -i "/ $filename_z/"d file.md5
      md5sum $file >> file.md5
      echo $file >> rsync_file
      else
      echo $file >>rsync_rm
      fi
    done
  for newfile in $(find $webroot -type f)
    do
      grep $newfile file.md5 >/dev/null 2>&1
      if [ $? -gt 0 ];then
      md5sum $newfile >> file.md5
      echo "$newfile" >> rsync_file
      fi
    done
for rfile in $(cat rsync_file)
do
rsync -avzp $rfile /home/www3/
done

10、统计当前目录中以.html结尾的文件总大小

方法1:

# find . -name "*.html" -maxdepth 1 -exec du -b {} \; |awk '{sum+=$1}END{print sum}'

方法2:

for size in $(ls -l *.html |awk '{print $5}'); do

    sum=$(($sum+$size))

done

echo $sum

递归统计:

# find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'

11、 获取随机字符串或数字

获取随机8位字符串:

方法1:

# echo $RANDOM |md5sum |cut -c 1-8

471b94f2

方法2:

# openssl rand -base64 4

vg3BEg==

方法3:

# cat /proc/sys/kernel/random/uuid |cut -c 1-8

ed9e032c

获取随机8位数字:

方法1:

# echo $RANDOM |cksum |cut -c 1-8

23648321

方法2:

# openssl rand -base64 4 |cksum |cut -c 1-8

38571131

方法3:

# date +%N |cut -c 1-8

69024815

cksum:打印CRC效验和统计字节

12、获取字符串长度

# VAR='hello world!'
# echo $VAR
hello world!
# echo ${#VAR}
12

13、截取字符

截取从offset个字符开始,向后length个字符。

截取hello字符串:
# VAR='hello world!'
# echo ${VAR:0:5}
hello
截取wo字符:
# echo ${VAR:6:2}
wo
截取world!字符串:
# echo ${VAR:5}
world!
截取最后一个字符:
# echo ${VAR:(-1)}
!
截取最后二个字符:
# echo ${VAR:(-2)}
d!
截取从倒数第3个字符后的2个字符:
# echo ${VAR:(-3):2}
ld

14、替换字符串

格式:${parameter/pattern/string}

# VAR='hello world world!'
将第一个world字符串替换为WORLD:
# echo ${VAR/world/WORLD}
hello WORLD world!
将全部world字符串替换为WORLD:
# echo ${VAR//world/WORLD}
hello WORLD WORLD!

15、定义一个颜色输出字符串函数

方法1:

function echo_color() {
    if [ $1 == "green" ]; then
        echo -e "\033[32;40m$2\033[0m"
    elif [ $1 == "red" ]; then
        echo -e "\033[31;40m$2\033[0m"
    fi
}

方法2:

function echo_color() {
    case $1 in
        green)
            echo -e "\033[32;40m$2\033[0m"
            ;;
        red)
            echo -e "\033[31;40m$2\033[0m" 
            ;;
        *) 
            echo "Example: echo_color red string"
    esac
}

使用方法:echo_color green "test"

function关键字定义一个函数,可加或不加。

16、打印乘法口诀

方法1:
# awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}'
方法2:
for ((i=1;i<=9;i++)); do
   for ((j=1;j<=i;j++)); do
     result=$(($i*$j))
     echo -n "$j*$i=$result "
   done
   echo
done

输入五个100数之内的字符,统计和、最小和最大

COUNT=1
SUM=0
MIN=0
MAX=100
while [ $COUNT -le 5 ]; do
    read -p "请输入1-10个整数:" INT
    if [[ ! $INT =~ ^[0-9]+$ ]]; then
        echo "输入必须是整数!"
        exit 1
    elif [[ $INT -gt 100 ]]; then
        echo "输入必须是100以内!"
        exit 1
    fi
    SUM=$(($SUM+$INT))
    [ $MIN -lt $INT ] && MIN=$INT
    [ $MAX -gt $INT ] && MAX=$INT
    let COUNT++
done
echo "SUM: $SUM"
echo "MIN: $MIN"
echo "MAX: $MAX"
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、判断输入是否为数字
  • 2、 将目录下大于k的文件转移出去
  • 3、批量修改文件名
  • 4、ftp自动登录批量下载文件
  • 5、ftp自动登录上传文件
  • 6、ftp自动登录下载单个文件
  • 7、ftp自动登录上传单个文件
  • 8、监控目录,将新创建的文件名追加到日志中
  • 9、监控LINUX目录和文件变化
  • 10、统计当前目录中以.html结尾的文件总大小
  • 11、 获取随机字符串或数字
  • 12、获取字符串长度
  • 13、截取字符
  • 14、替换字符串
  • 15、定义一个颜色输出字符串函数
  • 16、打印乘法口诀
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档