fi
sleep600
done
6.从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":
"分割的第5个字段
grep-E"WARNING|FATAL"a.log|grep-v"IGNOR"|cut-f5-d':
'
7.编写一个脚本,进行简单的减法运算,要求提示输入变量
#!
/bin/bash
if[$#=2];then
num3=`expr$1-$2`
else
read-p"inputanumber:
"num1
read-p"inputanothernumber:
"num2
num3=`expr$num1-$num2`
fi
echo$num3
8.把某个目录下的文件扩展名改为bat,再以时间为文件名压缩打包存放到某个目录。
#!
/bin/bash
iftest$#-eq1-a-d$1;then
forfilein`ls$1`
do
mv$file$file.bat
done
filename=date+%y%m%d
tar-cjvf$filename.tar.bz2
else
echo"inputdir"
readdir
forfilein`ls$dir`
do
mv$file$file.bat
done
filename=date+%y%m%d
tar-cjvf$filename.tar.bz2
fi
9.判断一个数是不是完数。
打印出1-1000之间的完数。
完数就是约数的和等于自身2倍的数。
(6,28,496)
(1)
#!
/bin/bash
sub()
{
i=1;
sum=0;
while[$i-le$num]
do
let"m=num%i"
if[$m-eq0]
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-le1000]
do
sub
let"num=num+1"
done
(2)
#!
/bin/bash
for((i=1;i<=1000;i++))
do
sum=0
for((j=1;j<=i;j++))
do
m=`expr$i%$j`
if[$m-eq0];then
sum=`expr$sum+$j`
fi
done
y=`expr$i\*2`
if[$y-eq$sum];then
echo$i
fi
done
10.在某个文件夹下查找含有指定字符串的文件
#!
/bin/bash
forfilein`ls$2`
do
f=`grep-l$1$2$file`
echo$f
done
调用方法:
./tst000bash#在文件夹bash中查找含有“000”的文件。
11.添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。
groupaddclass1
for((i=0;i<=30;i++))
do
if[$i-lt10];then
no="0$i"
else
no="$i"
fi
echo"stu$no"
useradd-gclass1stu$no
passwd-dstu$no
chage-d0stu$no
done
12.实现自动删除50个账号的功能。
账号名为stud1至stud50
#!
/bin/bash
for((i=0;i<=50;i++))
do
userdel-rstu$i
done
13.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:
读;文件所有者的权限为:
读、写、执行;文件所有者所在组的权限为:
读、执行。
#!
/bin/bash
mkdir/userdata
cd/userdata
for((i=1;i<=50;i++))
do
mkdiruser$i
chmod754user$i
done
14.一个文件内容全部是类似
【202.205.151.21】--【23:
59:
22】-“HTTPGET”-“Mozila”
...
写一个SHELL命令找出最多的10个IP
awk-F"--"'{print$1}'shit|sort|uniq-c|sort-r|sed-n'1,10p'
个人cat$1|cut-c2-15|sort|uniq
15./tmp路径下有800个文件
文件名的格式是:
filename_YYYYMMDD_序列号(从001到999).dat,例如:
filename_20040108_089.dat。
现在想把这些文件改名,新文件名的格式是:
filename_TODAY(当前日期)_序列号(从500开始,到达999之后从001开始).dat,例如:
把filename_20040108_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`
foreachin$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-gt999]&&DEST_FILE_PART3=`expr$OLD_NUM-499`
&&DEST_FILE_PART3=`printf%03d$DEST_FILE_PART3`
DEST_FILE=$DEST_FILE_PART1$DEST_FILE_PART2$DEST_FILE_PART3$EXT_NAME
echo"mv$eachto$DEST_FILE"
mv$each$DEST_FILE
done
我的解法:
#!
/bin/bash
new_file=$(date+20%y%m%d);
forfilein$(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-gt999]
then
let"ii=ii-999"
fi
ii=`printf%03d$ii` #添上可能需要的‘0’
update=$(echo"$file"|sed's/\(.*\)_[0-9]*_[0-9]*.dat/\1_'$new_file'_'$ii'.dat/')
mv~/bash/$file~/bash/$update
done
临时:
#
forfilein`ls/tmp`
do
f1=$(date+20%y%m%d);
f2_1=cat$file|cut-f3-d'_'|cut-f1-d'.'
if[f2_1-lt500];then
f2=`expr$f2_1+500`
else
f2=`expr$f2_1-499`
fi
new_filename="filename_$f1_$f2.dat"
mv$file$new_filename
done
个人解法
#
forfilein`ls/tmp`
do
f1=$(date+20%y%m%d);
f2_1=`echo$file|cut-f3-d'_'|cut-f1-d'.'`
echo$f2_1
if[$f2_1-lt500];then
f2=`expr$f2_1+500`
else
f2=`expr$f2_1-499`
fi
new_filename="filename_$f1_$f2.dat"
mv/tmp/$file/tmp/$new_filename
done
16.要求:
在一个脚本中完成这个程序
1.从文件user.list中取出已给定的用户名和用户组,将这些用户和组按规则添加到系统中
2.从password.list中读取已经给定的用户密码。
user.list如下
zhangsanadminuser,dbuser,updatauser
lisidbuser,updatauser
wangerupdatauser,wheel
#!
/bin/bash
#groupadd
forxin‘awk‘{print$2}’user.list|sed’s/,/\n/g’|sort|uniq-c|sed’s/[^a-zA-Z]//g”
do
groupadd$x&>/dev/null
done
#backmessage
if(($?
==0))
then
echo“GroupOk!
!
”
else
exit1
fi
#useradd
foriin‘awk‘{print$1}’user.list’
do
foryin‘awk‘{print$2}’password.list’
do
useradd$i&>/dev/null
echo$y|passwd–stdin$i&>/dev/null
done
done
#backmessage
if(($?
==0))
then
echo“UserOk!
”
else
exit1
fi
#adduserstogroups
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“AllFinished!
”
fi
原文地址
17.比较两个小数大小。
awk-vnum1=6.6-vnum2=5.5'BEGIN{print(num1>num2)?
"0":
"1"}'
echo"0.14>0.15"|bc
expr1.2\<1.3
18终端取字符
#!
/bin/sh
echo"Inputdatewithformatyyyymmdd:
\c"
readyearmonthday
echo"Todayis$year/$month/$day,right"
echo"pressentertoconfirmandcontinue\c"
reada
echo"Iknowthedate,bye"
注释:
#!
/bin/sh指定解析shell的类型,sh为传统shell,bash为默认使用的shell
\c这个转义字符表示,不换行,只能使用与sh类型的shell
19判断文件类型
#!
/bin/sh
if[$#-ne1]
thenecho"agrciserror"
exit
fi
if[-f$1]
thenecho"thisisfile"
fi
if[-d$1]
thenecho"thisisdirctory"
fi
20文件拷贝
#!
/bin/sh
if[$#-ne1]
then
echopleaseinput1argument
exit
fi
if[-d$HOME/$1]
then
echodirctoryisexsit,copying...
else
mkdir$HOME/$1
fi
flist=`ls`
forfilein$flist
do
cp$file$HOME/$1
done
echocopydone
21判断用户是否在线
#!
/bin/sh
check_user()
{
user=`who|cut-f1-d''`
fornamein$user
do
if[$name=$1]
then
return1
else
return0
fi
done
}
whiletrue
do
echo"inputusername:
\c"
readname
check_user$name
if[$?
-eq1]
then
echo"usernameisonline"
else
echo"usernameisoffline"
fi
done