- 本文中的题目均来自于互联网
2020-10-29
- 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2020-10-29.log, 并且把磁盘的使用情况写到到这个文件中,(不用考虑cron,仅仅写脚本即可)!
#!/bin/bash
file_name=`date -d "today" "+%Y-%m-%d"`
touch ${file_name}.log
df -h > ${file_name}.log
- 统计日志
- 有日志1.log,内容如下:
112.111.12.248 - [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com "/seccode.php?update=0.5593110133088248" 200"http://formula-x.haotui.com/registerbbs.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"
61.147.76.51 - [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com "/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71" 301"http://xyzdiy.5d6d.com/thread-1435-1-23.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
- 要求: 统计出每个IP的访问量有多少?
cat 1.log | awk '{print $1}' | sort -n | uniq -c
- 统计内存使用
- 写一个脚本计算一下linux系统所有进程占用内存大小的和。(提示,使用ps或者top命令)
ps aux | grep -v "RSS" |awk '{ ((sum=sum+$6))}END{print sum}'
或者
#!/bin/bash
sum=0
for mem in `ps aux | grep -v "RSS" | awk '{print $6 }'`
do
sum=$(($sum+$mem))
done
echo "The total memory is $sum k"
- 批量更改文件名
- 找到/123目录下所有后缀名为.txt的文件,
- 批量修改.txt为.txt.bak
- 把所有.bak文件打包压缩为123.tar.gz
- 批量还原文件的名字,即把增加的.bak再删除
#!/bin/bash
##找到.txt文件
find /mnt/files -type f -name "*.txt" > new_files
#遍历 重命名
for file in `cat new_files`
do
mv $file $file.bak
done
#创建新目录 为压缩做准备
dir_name=`date "+%Y%m%d"`
mkdir $dir_name
for file in `cat new_files`
do
cp $file.bak ./$dir_name
done
##压缩
tar czf $dir_name.tar.gz $dir_name/
#还原
for file in `cat new_files`
do
mv $file.bak $file
done
2020-10-31
- 求100内的质数。(通过shell 脚本)
#!/bin/bash
echo 2
for i in `seq 3 2 100`
do
for j in `seq 2 $i`
do
if [ $(($i%$j)) -ne 0 ]
then
echo $i
break
fi
done
done
- 编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
#!/bin/bash
file_name=/mnt/myr
cd /mnt/myr
echo `ls $file_name` > newfiles
for i in `cat newfiles`
do
file_memory=`du -b $i`| awk '{print $1}'
if [[ $file_memory -gt 10 ]]
then
#echo yes
mv $i /tmp
fi
done
2020-11-1
- 打印本机的交换分区大小,处理结果: Swap:1024M
echo "Swap:$(free -m |sed -n '/Swap/p' | awk '{print $2}')"
- 文件整理,employee文件中记录了工号和姓名
100 Jason Smith
200 John Doe
300 Sanjay Gupta
400 Ashok Sharma
bonus文件中记录工号和工资:
100 $5,000
200 $500
300 $3,000
400 $1,250
要求把两个文件合并并输出如下,处理结果:
400 ashok sharma $1,250
100 jason smith $5,000
200 john doe $500
300 sanjay gupta $3,000
#!/bin/bash
##判断文件的行数
n1=`cat employee|awk '{print NR}'|tail -n1`
n2=`cat bonus|awk '{print NR}'|tail -n1`
##遍历 判断
for i in `seq 1 $n1`
do
for j in `seq 1 $n2`
do
a=`cat employee| head -n$i|tail -n1| awk '{print $1}'`
b=`cat bonus| head -n$j|tail -n1| awk '{print $1}'`
if [[ $a -eq $b ]]
then
echo `cat employee | head -n$i|tail -n1|awk '{print $1 $2}'` `cat bonus| head -n$j|tail -n1| awk '{print $2}'`
fi
done
done
- 上述方法没有进行排序
- 还有一种简单的方法,可以进行排序
sort employee &> /dev/null
sort bonus &> /dev/null
join employee bonus | sort -k2
[root@server1 files]# ./23.sh
400 Ashok Sharma $1,250
100 Jason Smith $5,000
200 John Doe $500
300 Sanjay Gupta $3,000
注意:join 方法
join 【命令选项】 文件1 文件2
命令选项可以很多, 但文件只能是两个
- join 的作用是把两个文件对一列求交集,然后输出交集部分。
2020-11-2
- 查看apache的访问日志,查看访问成功的ip
#!/bin/bash
n=`cat /etc/httpd/logs/access_log | awk '{print NR}' | tail -n1`
for i in `seq 1 $n`
do
num=`cat /etc/httpd/logs/access_log | head -n$i | tail -n1| awk '{print $9}'| cut -c 1`
if [[ 2 -eq $num ]]
then
echo `cat /etc/httpd/logs/access_log | head -n$i | tail -n1| awk '{print $1}'`
fi
done
- 查看apache 访问日志,找出页面访问数量在前100的
cat /etc/httpd/logs/access_log | awk '{print $1}'| sort | uniq -c| sort -nr|head -n100
2020-11-3
- 打印"i am a student in china"这句话中字母数小于5的单词
#!/bin/bash
for i in i am a student in china
do
[ ${#i} -lt 5 ] && echo "$i"
done
2.你的linux系统中是否有自定义用户(普通用户),若是有,一共有几个?
#!/bin/bash
sum=0
for i in `cat /etc/passwd | awk -F : '{print $3}'`
do
[ $i -ge 1000 ] && sum=$(($sum+1))
done
[ $sum -eq 0 ] && echo "this os have no ordinary user"
[ $sum -gt 0 ] && echo "The number of ordinary user of this OS is $sum"
- 写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10.
cat /root/.bash_history | awk '{print $1}'| sort | uniq -c | sort -nr | head -n 10
- 脚本批量创建n个用户,密码统一为123,需要对用户输入是否为数字和输入的名字是否为空做判断
#!/bin/bash
read -p "PLease input the username prefix:" qian
[ -z $qian ] && echo 'the prefix can not be empty' && exit
read -p "Please input the count of users:" count
[ -z $count ] && echo 'the count can not be empty' && exit
for i in `seq 1 $count`
do
useradd $qian$i
echo '123' | passwd $qian_$i --stdin &> /dev/null
done