日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

shell实例总结

發(fā)布時(shí)間:2025/6/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell实例总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

-eq ? ? ? ? ? //等于

-ne ? ? ? ? ? //不等于

-gt ? ? ? ? ? ?//大于 (greater )

-lt ? ? ? ? ? ?//小于 ?(less)

-ge ? ? ? ? ? ?//大于等于

-le ? ? ? ? ? ?//小于等于

/********************************************************************************************************************************/

1. 設(shè)計(jì)一個(gè)shell程序,在每月第一天備份并壓縮/etc目錄的所有內(nèi)容,存放在/root/bak目錄里,且文件名為如下形式y(tǒng)ymmdd_etc,yy為年,mm為月,dd為日。Shell程序fileback存放在/usr/bin目錄下


1)首先編寫(xiě)備份文件的腳本fileback.sh

#!/bin/bash if [ ! -e "/root/bak" ]; ? //首先查看/root/bak目錄是否存在,如果不存在,則創(chuàng)建目錄 then mkdir /root/bak fi cd /root/bak ? ?//將當(dāng)前目錄更改到/root/bak YY=$(date +%Y) ?//提取日期中的年月日 mm=$(date +%m) DD=$(date +%d) backupdir="$YY$mm$DD"_etc.tar.gz ?//這里必須注意,在$YY$mm$DD上加引號(hào),否則shell會(huì)將$DD_etc認(rèn)為是一個(gè)變量,獲取不到$DD的值 echo $backupdir tar zcvf $backupdir /etc/ echo "fileback finished!"

2) 使用Cron表達(dá)式

創(chuàng)建包含cron表達(dá)式的task文件task.cron 0 0 1 * * /root/fileback.sh 使用一下命令啟動(dòng)定時(shí)任務(wù) # crontab task.cron


PS:
使用以下命令查看和刪除Cron表:
# crontab -l ? //查看Cron表
0 1 * * * /root/fileback.sh
# crontab -r ?//刪除Cron表

?

2.編寫(xiě)shell程序,實(shí)現(xiàn)自動(dòng)刪除50個(gè)賬號(hào)的功能。賬號(hào)名為stud1至stud50。

#!/bin/bash i=1 while [ $i -lt 50 ] doif [ $i -ne 50 ]thenuserdel stud0${i}elseusedel stud${i}fii=`expr $i + 1` done

3.設(shè)計(jì)一個(gè)shell程序,添加一個(gè)新組為class1,然后添加屬于這個(gè)組的? ? ? 30個(gè)用戶,用戶名的形式為stdxx,其中xx從01到30。

#!/bin/bash groupadd class1 for ((i=1;i<=30;i++)) do if [ $i -lt 10 ];then username="std0"$i else username="std"$i fi useradd -G class1 $username done注意-G:指定用戶所屬的附加群組。

4.判斷一文件是不是字符設(shè)備文件,如果是將其拷貝到 /dev 目錄下。

#! /bin/bash #cp.shecho ?-e "please input filename /n" read FILENAME if[ -c $FILENAME ] thencp $FILENAME /dev elseecho "It's not Charactor device file" fi

注意:其中有[ -c FILENAME ]這個(gè)命令就是判斷FILENAME是否是字符設(shè)備,如果是為真;如果不是為假;

/********************************************************************************************************************************/

1.查找當(dāng)前目錄中所有大于500M的文件,把這些文件名寫(xiě)到一個(gè)文本文件中,并統(tǒng)計(jì)其個(gè)數(shù)。
find ./ -size +500M -type f | tee file_list | wc -l
2.在目錄/tmp下找到100個(gè)以abc開(kāi)頭的文件,然后把這些文件的第一行保存到文件new中。
for filename in `find /tmp -type f -name "abc*"|head -n 100`
do
sed -n '1p' $filename>>new
done
3.把文件b中有的,但是文件a中沒(méi)有的所有行,保存為文件c,并統(tǒng)計(jì)c的行數(shù)。
grep -xvf a b | tee c | wc -l
4.判斷一文件是不是塊或字符設(shè)備文件,如果是將其拷貝到 /dev 目錄下
read -p "input a file:" filename
if [ -b $filename -o -c $filename ]
then
????cp $filename /dev/
fi
5.每隔10分鐘監(jiān)控一次,監(jiān)控/usr下如果大于5G,發(fā)郵件給管理員
#!/bin/bash
while true
do
????sleep 600
????n=$(du -s /usr | cut -f1)
????if [ $n -gt 5242880 ]
????then
????????mail -s "greater"?filwsyl@gmail.com?< ~/filename #將文件filename的內(nèi)容發(fā)送出去。
????fi
done
6.從a.log文件中提取包含"WARNING"或"FATAL",同時(shí)不包含"IGNOR"的行,然后提取以":"分割的第5個(gè)字段
grep -E 'WARNING|FATAL' a.log | grep -v IGNOR | awk -F ":" '{print $5}'
7.編寫(xiě)一個(gè)腳本,進(jìn)行簡(jiǎn)單的減法運(yùn)算,要求提示輸入變量
#!/bin/bash
read -p "input a number:" num1
read -p "input another number:" num2
let "num3=num1-num2"
echo $num3
8.把某個(gè)目錄下的文件擴(kuò)展名改為bat,再以時(shí)間為文件名壓縮打包存放到某個(gè)目錄。
#!/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.從網(wǎng)上下載一個(gè)文件,保存到指定目錄
#!/bin/bash
url=http://rs1.bn.163.com/ent/2009/05/20_canquedege.wma
dir=~/下載
wget -P $dir $url
10.判斷一個(gè)數(shù)是不是完數(shù)。打印出1-1000之間的完數(shù)。完數(shù)就是約數(shù)的和等于自身2倍的數(shù)。(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.在某個(gè)文件夾下查找含有指定字符串的文件
#!/bin/bash
for file in $(ls $2)
do
????bname=$(grep -l $1 $2/$file)
????basename $bname
done
調(diào)用方法:./tst 000 bash#在文件夾bash中查找含有“000”的文件。
13.添加一個(gè)新組為class1,然后添加屬于這個(gè)組的30個(gè)用戶,用戶名的形式為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.實(shí)現(xiàn)自動(dòng)刪除50個(gè)賬號(hào)的功能。賬號(hào)名為stud1至stud50
#!/bin/bash
i=0
while [ i -le 50 ]
do
???let i++
???????userdel -r stud$i
done
15.某系統(tǒng)管理員需每天做一定的重復(fù)工作,請(qǐng)按照下列要求,編制一個(gè)解決方案:
(1)在下午4 :50刪除/abc目錄下的全部子目錄和全部文件;
(2)從早8:00~下午6:00每小時(shí)讀取/xyz目錄下x1文件中每行第一個(gè)域的全部數(shù)據(jù)加入到/backup目錄下的bak01.txt文件內(nèi);
(3)每逢星期一下午5:50將/data目錄下的所有目錄和文件歸檔并壓縮為文件:backup.tar.gz;
(4)在下午5:55將IDE接口的CD-ROM卸載(假設(shè):CD-ROM的設(shè)備名為hdc);
(5)在早晨8:00前開(kāi)機(jī)后啟動(dòng)。
vim /etc/crontab 在里面增加下面內(nèi)容:
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前開(kāi)機(jī)后啟動(dòng) --> 這個(gè)我不是很明白它的意思,不知道是不是8點(diǎn)前開(kāi)機(jī)就啟動(dòng)上面的設(shè)定,8點(diǎn)后才開(kāi)機(jī)就不用啟動(dòng)的意思。姑且用下面這個(gè)命令吧。
chkconfig --level 2345 crond on
16.設(shè)計(jì)一個(gè)shell程序,在每月第一天備份并壓縮/etc目錄的所有內(nèi)容,存放在/root/bak目錄里,且文件名
為如下形式y(tǒng)ymmdd_etc,yy為年,mm為月,dd為日。Shell程序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.有一普通用戶想在每周日凌晨零點(diǎn)零分定期備份/user/backup到/tmp目錄下,該用戶應(yīng)如何做?
首先說(shuō)一下非root用戶編寫(xiě)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
查看結(jié)果:
[root@localhost cron]# crontab -u sword -l
顯示內(nèi)容是:/var/spool/cron/sword 文件的內(nèi)容。
vim ~/shit.sh
#!/bin/bash
cp /user/backup/* /tmp/
--------------------------------------------
crontab -e
0 0 * * 0 ~/shit.sh &
18.設(shè)計(jì)一個(gè)Shell程序,在/userdata目錄下建立50個(gè)目錄,即user1~user50,并設(shè)置每個(gè)目錄的權(quán)限,其
中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫(xiě)、執(zhí)行;文件所有者所在組的權(quán)限為:讀、執(zhí)行。
#!/bin/bash
for ((i=1;i<=50;i++))
do
???????mkdir -p /usrdata/user$i
???????cd /usrdata
???????chmod 754 user$i
done
19.一個(gè)文件內(nèi)容全部是類(lèi)似
【202.205.151.21】--【23:59:22】-“HTTP GET”-“Mozila”
...
寫(xiě)一個(gè)SHELL命令找出最多的10個(gè)IP
awk -F "--" '{print $1}' shit | sort | uniq -c | sort -r | sed -n '1,10p'
20./tmp路徑下有800個(gè)文件,文件名的格式是:filename_YYYYMMDD_序列號(hào)(從001到999).dat, 例如:filename_20040108_089.dat?,F(xiàn)在想把這些文件改名,新文件名的格式是:filename_TODAY(當(dāng)前日期)_序列號(hào)(從500開(kāi)始,到達(dá)999之后從001開(kāi)始).dat,例如: 把filename_20040108_089.dat改為filename_20041222_589.dat,注意新文件名的序列號(hào)的順序需要和原來(lái)的一致,即要做排序處理。
#!/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/')????#取出序列號(hào)
????i=$(echo $i | sed 's/^0*\([0-9]*\)/\1/')????????????????#去掉序列號(hào)前面可能的 ‘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.要求:在一個(gè)腳本中完成這個(gè)程序
1.從文件user.list中取出已給定的用戶名和用戶組,將這些用戶和組按規(guī)則添加到系統(tǒng)中
2.從password.list中讀取已經(jīng)給定的用戶密碼。
user.list如下
zhangsan adminuser,dbuser,updatauser
lisi dbuser,updatauser
wanger updatauser,wheel

#!/bin/bash
#group add
for x in ‘a(chǎn)wk ‘{print $2}’ user.list | sed ’s/,/\n/g’ | sort | uniq -c|sed ’s/[^a-zA-Z]//g”
do
????????groupadd $x &> /dev/null
done
#back message
if (($?==0))
then
????????echo “Group Ok!!”
else
????exit 1
fi
#user add
for i in ‘a(chǎn)wk ‘{print $1}’ user.list’
do
????for y in ‘a(chǎn)wk ‘{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 ‘a(chǎn)wk “NR==$q {print $2}” user.list | awk ‘{print $2}” ‘a(chǎn)wk “NR==$q {print $1}” user.list | awk ‘{print $1}” &> /dev/null
done
if (($?==0))
then
????echo “All Finished!”
fi
22.比較兩個(gè)小數(shù)大小。
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
??

24. Shell腳本閱讀(解釋下面執(zhí)行的功能),請(qǐng)?zhí)舫鱿旅娉绦蚧蚰_本中的錯(cuò)誤,并說(shuō)明錯(cuò)在哪里。

#!/bin/bash

#監(jiān)控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 "端口異常,請(qǐng)?zhí)幚?"?test@aa.com</dev/null

fi>

?

命令行替換用反引號(hào),if [$?==0] 應(yīng)該寫(xiě)做if [ $?=0 ],用來(lái)判斷上次命令是否執(zhí)行成功;

倒數(shù)第二行應(yīng)該是>/dev/null,最后fi后面的>去掉。

?

25. 設(shè)計(jì)一個(gè)shell程序,在每月第一天備份并壓縮/etc目錄的所有內(nèi)容,存放在/root/bak目錄里,且文件名為如下形式y(tǒng)ymmdd_etc,yy為年,mm為月,dd為日。Shell程序fileback存放在/usr/bin目錄下。
參考答案:
(1)編寫(xiě)shell程序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)編寫(xiě)任務(wù)定時(shí)器:
echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron
crontab /root/etcbakcron
或使用crontab -e 命令添加定時(shí)任務(wù):
0 1 * * * /bin/sh /usr/bin/fileback


26. 有10臺(tái)被監(jiān)控主機(jī),一臺(tái)監(jiān)控機(jī),在監(jiān)控機(jī)上編寫(xiě)腳本,一旦某臺(tái)監(jiān)控機(jī)器/分區(qū)使用率大于80%,就發(fā)出報(bào)警,放到crontab里面,每10分鐘檢查一次。

(1)首先,建立信任關(guān)系 1 VS 10. 但拿兩臺(tái)機(jī)器(192.168.1.6,192.168.1.4)做試驗(yàn)

#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

這里把公鑰取名為可信任主機(jī)的IP地址

現(xiàn)在登錄到192.168.1.4機(jī)器

#cd .ssh/

#cat 192.168.1.6 >> authorized_keys

然后回到192.168.1.6機(jī)器。

#ssh 192.168.1.4

這樣就可以了,里面可能涉及到權(quán)限問(wèn)題。一般.ssh/文件夾為755,authorized_keys 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 .......)???//十個(gè)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)] //計(jì)算有多少行

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里面

#######################################################################

################讓腳本每十分鐘執(zhí)行一次#################################

在cron表中:

0/10 * * * * /home/codefei/diskcheck.sh 2>&1

?

27. 用Shell編程,判斷一文件是不是字符設(shè)備文件,如果是將其拷貝到 /dev 目錄下。
參考程序:
#!/bin/sh
FILENAME=
echo “Input file name:”
read FILENAME
if [ -c "$FILENAME" ]
then

cp $FILENAME /dev
fi

總結(jié)

以上是生活随笔為你收集整理的shell实例总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。