Shell 练习汇总--持续更新中

  • 本文中的题目均来自于互联网

2020-10-29

  1. 请按照这样的日期格式(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. 统计日志
  • 有日志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
  1. 统计内存使用
  • 写一个脚本计算一下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"
  1. 批量更改文件名
  • 找到/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

  1. 求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
  1. 编写个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

  1. 打印本机的交换分区大小,处理结果: Swap:1024M
echo "Swap:$(free -m |sed -n '/Swap/p' | awk '{print $2}')"
  1. 文件整理,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

  1. 查看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
  1. 查看apache 访问日志,找出页面访问数量在前100的
cat /etc/httpd/logs/access_log | awk '{print $1}'| sort  |  uniq -c| sort -nr|head -n100

2020-11-3

  1. 打印"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"
  1. 写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10.
cat /root/.bash_history | awk '{print $1}'| sort | uniq -c | sort -nr | head -n 10
  1. 脚本批量创建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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值