셸 프로 그래 밍 인 스 턴 스 수집

45297 단어 Linux기술.
셸 인 스 턴 스 수집 셸 프로 그래 밍 입문
http://www.runoob.com/linux/linux-shell-variable.html
http://c.biancheng.net/cpp/shell/
1. 현재 디 렉 터 리 에 있 는 500 M 이상 의 파일 을 찾 아서 이 파일 들 의 이름 을 텍스트 파일 에 쓰 고 그 개 수 를 집계 합 니 다.
find ./ -size +500M -type f | tee file_list | wc -l

2. 디 렉 터 리 / tmp 에서 abc 로 시작 하 는 파일 100 개 를 찾 은 다음 이 파일 의 첫 줄 을 파일 new 에 저장 합 니 다.
for filename in `find /tmp -type f -name "abc*"|head -n 100`
do
sed -n '1p' $filename>>new
done

3. 파일 b 에 있 지만 파일 a 에 없 는 모든 줄 을 파일 c 로 저장 하고 c 의 줄 수 를 집계 합 니 다.
grep -xvf a b | tee c | wc -l

4. 파일 이 블록 이나 문자 장치 파일 인지 판단 하고 / dev 디 렉 터 리 에 복사 하면
read -p "input a file:" filename
if [ -b $filename -o -c $filename ]
then
    cp $filename /dev/
fi

5. 10 분 간격 으로 모니터링 하고 모니터링 / usr 에서 5G 이상 이면 관리자 에 게 메 일 을 보 냅 니 다.
#!/bin/bash
while true
do
    sleep 600
    n=$(du -s /usr | cut -f1)
    if [ $n -gt 5242880 ]
    then
        mail -s "greater" [email protected] < ~/filename #   filename       。
    fi
done

6. a. log 파일 에서 "WARNING" 또는 "FATAL" 을 포함 하 는 줄 을 추출 하고 "IGNOR" 를 포함 하지 않 은 줄 을 추출 한 다음 ":" 로 분 단 된 다섯 번 째 필드 를 추출 합 니 다.
grep -E 'WARNING|FATAL' a.log | grep -v IGNOR | awk -F ":" '{print $5}'

7. 스 크 립 트 를 작성 하여 간단 한 감법 연산 을 하고 입력 변 수 를 제시 해 야 합 니 다.
#!/bin/bash
read -p "input a number:" num1
read -p "input another number:" num2
let "num3=num1-num2"
echo $num3

8. 특정한 디 렉 터 리 에 있 는 파일 확장 자 를 bat 로 바 꾸 고 시간 을 파일 이름 으로 압축 하여 특정한 디 렉 터 리 에 저장 합 니 다.
#!/bin/bash
for file in $(ls $1)
do
    new_file=${file%.*}.bat
    mv ./$1/$file ./$1/$new_file
    tmp=$(date +%y)
    tar cvf ./$tmp.tar ./$1
done

9. 인터넷 에서 파일 을 다운로드 하여 지정 한 디 렉 터 리 에 저장
#!/bin/bash
url=http://rs1.bn.163.com/ent/2009/05/20_canquedege.wma
dir=~/  
wget -P $dir $url

10. 한 수의 완수 여 부 를 판단 한다.1 - 1000 사이 의 완 수 를 인쇄 하 다.완 수 는 약수 의 합 이 자신의 두 배 와 같은 수 이다.(6,28,496)
#!/bin/bash
sub()
{
    i=1;
    sum=0;
    while [ $i -le $num ]
    do
        let "m=num%i"
        if [ $m -eq 0 ]
        then
            let "sum=sum+i"
        fi
        let "i=i+1"
    done
    let "a=2*num"
    if [ $a -eq $sum ]
    then
        echo $num
    fi
}
num=1
while [ $num -le 1000 ]
do
    sub
    let "num = num+1"
done

11. 행위 단위 로 파일 A 와 파일 B 의 교 집합, 집합, 차 집합 을 구한다.
# :
sort -m <(sort A | uniq) <(sort B | uniq) | uniq
# :
sort -m <(sort A | uniq) <(sort B | uniq) | uniq -d
# :
sort -m <(sort A | uniq) <(sort B | uniq) <(sort B | uniq) | uniq -u

12. 특정한 폴 더 에서 지정 한 문자열 이 있 는 파일 찾기
#!/bin/bash
for file in $(ls $2)
do
    bname=$(grep -l $1 $2/$file)
    basename $bname
done
#    :
./tst 000 bash
#    bash     “000”   。

13. 새 그룹 을 class 1 로 추가 한 다음 에 이 그룹 에 속 하 는 30 명의 사용 자 를 추가 합 니 다. 사용자 이름 의 형식 은 stdxx 이 고 그 중에서 xx 는 01 에서 30 까지 입 니 다.
#!/bin/bash
groupadd class1
for i in {9901..9930}
do
    xx=$(echo $i | sed 's/99//');
    useradd -g class1 std$xx -p ""
done

14. 50 개의 계 정 을 자동 으로 삭제 하 는 기능 을 실현 한다.계 정 이름 은 stud 1 부터 stud 50 까지 입 니 다.
#!/bin/bash
i=0
while [ i -le 50 ]
do
   let i++
       userdel -r stud$i
done

15. 특정한 시스템 관리 자 는 매일 일정한 중복 작업 을 해 야 합 니 다. 아래 의 요구 에 따라 해결 방안 을 작성 하 십시오.
  • (1) 오후 4 시 50 분 에 / abc 디 렉 터 리 의 모든 하위 디 렉 터 리 와 모든 파일 을 삭제 합 니 다.(2) 오전 8 시 부터 오후 6 시 까지 시간 당 읽 기 / xyz 디 렉 터 리 아래 x1 파일 의 줄 당 첫 번 째 필드 의 모든 데 이 터 를 / backup 디 렉 터 리 에 있 는 bak 01. txt 파일 에 추가 합 니 다.(3) 월요일 오후 5 시 50 분 마다 / data 디 렉 터 리 에 있 는 모든 디 렉 터 리 와 파일 을 압축 하여 파일 로 압축 합 니 다: backup. tar. gz;(4) 오후 5 시 55 분 에 IDE 인터페이스의 CD - ROM 을 마 운 트 해제 합 니 다 (가설: CD - ROM 의 장치 이름 은 hdc).(5) 아침 8 시 전에 시동 을 걸 었 습 니 다.

  • vim / etc / crontab 안에 다음 내용 을 추가 합 니 다:
    #1)
    50 16 * * * root rm -rf /abc/* 2>&1 &
    #2)
    00 8-18 * * * root cat /xyz/x1|awk '{print $1}' >> /backup/bak01.txt 2>&1 &
    #3)
    50 17 * * 1 root cd /data;tar -zcvf backup.tar.gz * 2>&1 &
    #4)
    55 17 * * * root umount /hdc 2>&1 &
    #5)   8:00       -->             ,      8            ,8             。          。
    chkconfig --level 2345 crond on
    

    16. 셸 프로그램 을 설계 하여 매달 첫날 / etc 디 렉 터 리 의 모든 내용 을 백업 하고 압축 하여 / root / bak 디 렉 터 리 에 저장 하고 파일 이름 은 다음 과 같은 형식 yymmd 입 니 다.etc, yy 는 년, mm 는 월, d 는 일.셸 프로그램 fileback 은 / usr / bin 디 렉 터 리 에 저 장 됩 니 다.
    vim /usr/bin/fileback.sh
    #!/bin/bash
    #fileback.sh
    #file executable: chmod 755 fileback.sh
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    filename=`date +%y%m%d`_etc.tar.gz
    cd /etc/
    tar -zcvf $filename *
    mv $filename /root/bak/
    ------------------------------------------------------
    vim /etc/crontab   
    * * 1 * * root ./fileback.sh &
    

    17. 한 일반 사용자 가 매주 새벽 0 시 0 분 에 정기 적 으로 백업 / user / backup 을 / tmp 디 렉 터 리 에 백업 하려 면 어떻게 해 야 합 니까?우선 루트 가 아 닌 사용자 가 crontab 파일 을 만 드 는 방법 을 말씀 드 리 겠 습 니 다.
    [sword@localhost ~]$ vim cronfile
    [sword@localhost ~]$ crontab cronfile
    [sword@localhost ~]$ crontab -e no crontab for sword - using an empty one crontab: installing new crontab
    #    :
    [root@localhost cron]# crontab -u sword -l
    #     :
    /var/spool/cron/sword      。
    vim ~/shit.sh
    #!/bin/bash
    cp /user/backup/* /tmp/
    --------------------------------------------
    crontab -e
    0 0 * * 0 ~/shit.sh &
    

    18. 셸 프로그램 을 설계 하여 / userdata 디 렉 터 리 에 50 개의 디 렉 터 리, 즉 user 1 ~ user 50 을 만 들 고 각 디 렉 터 리 의 권한 을 설정 합 니 다. 그 중에서 다른 사용자 의 권한 은 읽 기 입 니 다.파일 소유자 의 권한 은 읽 기, 쓰기, 실행 입 니 다.파일 소유자 가 있 는 그룹의 권한 은 읽 기, 실행 입 니 다.
    #!/bin/bash
    for ((i=1;i<=50;i++))
    do
           mkdir -p /usrdata/user$i
           cd /usrdata
           chmod 754 user$i
    done
    

    19. 한 파일 의 내용 은 모두 [202.205.151.21] - [23: 59: 22] - "HTTP GET" - "Mozilla"... SHELL 명령 을 써 서 가장 많은 IP 10 개 를 찾 습 니 다.
    awk -F "--" '{print $1}' shit | sort | uniq -c | sort -r | sed -n '1,10p'
    

    20. / tmp 경로 아래 800 개의 파일 이 있 습 니 다. 파일 이름 의 형식 은: filename 입 니 다.YYYYMMDD_시리 얼 번호 (001 부터 999 까지). dat, 예 를 들 어 filename20040108_089.dat。지금 이 파일 들 의 이름 을 바 꾸 려 고 합 니 다. 새 파일 이름 의 형식 은: filename 입 니 다.오늘 (현재 날짜)시리 얼 번호 (500 부터 999 까지 도착 하면 001 부터). dat, 예 를 들 어 filename20040108_089. dat 를 filename 로 변경20041222_589. dat, 새 파일 이름 의 시리 얼 번호 순 서 는 원래 의 것 과 일치 해 야 합 니 다. 즉, 정렬 처 리 를 해 야 합 니 다.
    #!/usr/bin/bash
    DEST_FILE_PART2="_`date '+%Y%m%d'`_"
    EXT_NAME=".dat"
    SRC_FILE_LIST=`find /tmp -name "*_*_*$EXT_NAME" -print`
    for each in $SRC_FILE_LIST; do
        DEST_FILE_PART1=`echo $each | awk -F"_" '{print $1}'`
        OLD_NUM=`echo $each | awk -F"_" '{print $3}' | awk -F"." '{print $1}'`
        DEST_FILE_PART3=`expr $OLD_NUM + 500`
        [ $DEST_FILE_PART3 -gt 999 ] && DEST_FILE_PART3=`expr $OLD_NUM - 499`
            && DEST_FILE_PART3=`printf d $DEST_FILE_PART3`
        DEST_FILE=$DEST_FILE_PART1$DEST_FILE_PART2$DEST_FILE_PART3$EXT_NAME
        echo "mv $each to $DEST_FILE"
        mv $each $DEST_FILE
    done
    

    나 는 이렇게 해도 된다 고 생각한다.
    #!/bin/bash
    new_file=$(date +20%y%m%d);
    for file in $(ls ~/bash)
    do
        i=$(echo "$file" | sed 's/.*_[0-9]*_\([0-9]*\).dat/\1/')    #     
        i=$(echo $i | sed 's/^0*\([0-9]*\)/\1/')                #           ‘0’,
        let "ii=i+500"
        if [ $ii -gt 999 ]
        then
            let "ii=ii-999"
        fi
        ii=`printf d $ii`                            #       ‘0’
        update=$(echo "$file" | sed 's/\(.*\)_[0-9]*_[0-9]*.dat/\1_'$new_file'_'$ii'.dat/')
        mv ~/bash/$file ~/bash/$update
    done
    

    21. 요구: 한 스 크 립 트 에서 이 프로그램 을 완성 합 니 다. 1. 파일 user. list 에서 지정 한 사용자 이름과 사용자 그룹 을 꺼 내 고 이 사용자 와 그룹 을 규칙 에 따라 시스템 에 추가 합 니 다. 2. password. list 에서 지정 한 사용자 암 호 를 읽 습 니 다.user. list 아래 zhangsan adminuser, dbuser, updatauser lisi dbuser, updatauser wanger updatauser, wheel
    #!/bin/bash
    #group add
    for x in ‘awk ‘{print $2}’ user.list | sed ’s/,/
    /g’ | sort | uniq -c|sed ’s/[^a-zA-Z]//g” do groupadd $ x &> /dev/null done #back message if (($ ? == 0 )) then echoGroup Ok!!else exit 1 fi #user add for i in ‘awk ‘{print $1}’ user.list’ do for y in ‘awk ‘{print $2}’ password.list’ do useradd $i &> /dev/null echo $y | passwd –stdin $i &> /dev/null done done #back message if (( $ ? == 0)) then echo “User Ok!else exit 1 fi #add users to groups for ((q=1;q<=3;q++)) do usermod -G ‘awk “NR==$q {print $2}” user.list | awk ‘{print $ 2}” ‘awk “NR==$q {print $ 1}” user.list | awk ‘{print $1}” &> /dev/null done if (($?==0)) then echo “All Finished!” fi

    22. 두 소수 크기 를 비교한다.
    awk -v num1=6.6 -v num2=5.5 'BEGIN{print(num1>num2)?"0":"1"}'
    echo "0.14 > 0.15" | bc
    expr 1.2 \< 1.3
      
    
  • Shell 스 크 립 트 읽 기 (아래 실 행 된 기능 설명) 아래 프로그램 이나 스 크 립 트 의 오 류 를 고 르 고 어디 가 틀 렸 는 지 설명 하 십시오.
  • #!/bin/bash
    
    #  cpuser point      
    
    logname="/home/forum/log/lpointlog.wf"
    
    flagfile="/home/forum/log/lognum.txt"
    
    lodnum=sed -n "1,1 p"$flagfile
    
    newnum=wc -l ${logname}
    
    echo $newnum >$flagfile
    
    totalnum=expr $newnum -$oldnum
    
    tail -n $totalnum $logname |grep "POINT_THREAD WARNING"
    
    if [$?==0]
    
    then
    
       mail -s "cpuser point "    ,   !" test@aa.com</dev/null
    
    fi>
    

    명령 행 을 바 꾸 는 데 반 따옴표, if [$? = 0] 는 if [$? = 0] 로 써 서 마지막 명령 이 실 행 했 는 지 여 부 를 판단 해 야 합 니 다.
    마지막 두 번 째 줄 은 > / dev / null 이 고 마지막 fi 뒤의 > 제거 해 야 합 니 다.
  • 셸 프로그램 을 설계 하여 매달 첫날 / etc 디 렉 터 리 의 모든 내용 을 백업 하고 압축 하여 / root / bak 디 렉 터 리 에 저장 하고 파일 이름 은 다음 과 같은 형식 yymmd 입 니 다.etc, yy 는 년, mm 는 월, d 는 일.셸 프로그램 fileback 은 / usr / bin 디 렉 터 리 에 저 장 됩 니 다.정 답 참조: (1) 셸 프로그램 fileback 작성:
  • #!/bin/sh
    DIRNAME=`ls /root | grep bak`
    if [ -z "$DIRNAME" ] ; then
    mkdir /root/bak
    cd /root/bak
    fi
    YY=`date +%y`
    MM=`date +%m`
    DD=`date +%d`
    BACKETC=$YY$MM$DD_etc.tar.gz
    tar zcvf $BACKETC /etc
    echo "fileback finished!"
    

    (2) 작업 타이머 작성:
    echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; 
    /root/etcbakcron crontab /root/etcbakcron
    #   crontab -e         :
    0 1 * * * /bin/sh /usr/bin/fileback
    
  • 감시 되 는 호스트 10 대, 감시 기 한 대, 감시 기 에서 스 크 립 트 를 작성 하고 특정한 감시 기기 / 파 티 션 사용률 이 80% 이상 이면 경 보 를 보 내 crontab 에 넣 고 10 분 마다 검사 합 니 다.

  • (1) 우선 신뢰 관계 구축 1 VS 10. 단, 기계 2 대 (192.168.1.6, 192.168.1.4) 로 시험
    #ssh-keggen -b 1024 -t rsa  //( root  )
    
    #cd .ssh/
    
    #ls
    
    id_rsa
    
    id_rsa.pub
    
    knows_host
    
    #scp id_rsa.pub 192.168.1.4:/root/.ssh/192.168.1.6
    

    여기 서 공개 키 를 신뢰 할 수 있 는 호스트 의 IP 주소 로 지 었 습 니 다.
    지금 192.168.1.4 기계 에 로그 인 했 습 니 다.
    #cd .ssh/
    #cat 192.168.1.6 >> authorized_keys
    그리고 192.168.1.6 기계 로 돌 아 왔 다.
    #ssh 192.168.1.4
    이렇게 하면 됩 니 다. 안에 권한 문제 가 있 을 수 있 습 니 다.일반. ssh / 폴 더 755, authorizedkeys 600 또는 644
    (2) 스 크 립 트 는 다음 과 같 습 니 다.
    #!/bin/sh
    
    #script:df_check.sh
    
    FSMAX="80"
    
    remote_user='root'
    
    remote_ip=(192.168.1.2 192.168.1.3 192.168.1.4 .......)   //  ip  
    
    ip_num='0'
    
    while [ "$ip_num" -le "$(expr ${#remote_ip[@]} - 1)" ]
    
    do
    
    read_num='1'
    
    ssh "$remote_user"@"${remote_ip[$ip_num]}" df -h >/tmp/diskcheck_tmp
    
    grep '^/dev/*' /tmp/diskcheck_tmp|awk '{print $5}'|sed 's/\%//g' >
    
    /tmp/diskcheck_tmp_num
    
    while [ "$read_num" -le $(wc -l < /tmp/diskcheck_tmp_num)] //      
    
    do
    
    size=$(sed -n "$read_num"'p' /tmp/diskcheck_tmp_num)
    
    if [ "$size" -gt "$FSMAX" ]
    
    then
    
    $(grep '^/dev/*' /tmp/diskcheck_tmp|sed -n $read_num'p' >
    
    /tmp/disk_mail)
    
    $(echo $(remote_ip[$ip_num]) >> /tmp/disk_mail)
    
    $(mail -s "diskcheck_alert" admin </tmp/disk_mail)
    
    fi
    
    read_num=$(expr $read_num + 1)
    
    done
    
    ip_num=$(expr $ip_num + 1)
    
    done
    

    (3) crontab 에 넣는다
    #######################################################################
    \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # 스 크 립 트 를 10 분 마다 실행 하 게 합 니 다 \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ #
    cron 표 에서:
    0/10 * * * * /home/codefei/diskcheck.sh 2>&1
    
  • Shell 프로 그래 밍 으로 파일 이 문자 장치 파일 인지 아 닌 지 판단 합 니 다. / dev 디 렉 터 리 에 복사 하면.참고 프로그램:
  • #!/bin/sh
    FILENAME=
    echo “Input file name:”
    read FILENAME
    if [ -c "$FILENAME" ]
    then
    
    cp $FILENAME /dev
    fi
    

    저자: 생황 은 여러분 과 저 와 기술적 인 문 제 를 교류 하 는 것 을 환영 합 니 다 QQ: 1348612681https://www.runoob.com/mysql/mysql-install.html https://www.jianshu.com/p/276d59cbc529 저자 증언: NULLPOINTEEXCEPTION!(농담 입 니 다. 셸 에 자바 이상 이 왜 생 겼 습 니까?)

    좋은 웹페이지 즐겨찾기