shell 编程练习

原作者GitHub地址
由于原100例适用于运维,这里我挑选了一些基础知识进行练习

  1. 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12-20.log, 并且把磁盘的使用情况写到到这个文件中, 不用考虑cron,仅仅写脚本即可
#!/bin/bash
d=`data +%F`
logfile=$d.log
df -h > $logfile

升级版本

#! /bin/bash
d=`date +%F`
dir=/data/log/disklog
if [ ! -d $dir ]
then
	mkdir -p $dir
fi
df -h > $dir/$d.log
find $dir/ -mtime +365 |xargs rm
date -d '3 day ago'   :  三天前...
find [路径] -type -f  -name "*.txt " :查找后缀是.txt的普通文件 
-mtime n : n为数字,意思为在n天之前的“一天之内”被更改过内容的文件
-mtime +n : 列出在n天之前(不含n天本身)被更改过内容的文件名
-mtime -n : 列出在n天之内(含n天本身)被更改过内容的文件名
xargs 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令

2.有日志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访问量有多少

awk '{print $1}' 1.log |sort |uniq -c |sort -n -r
uniq -c  去重并在前面显示重复的列
sort -n 根据数值排序  -r 逆序

3.写一个脚本计算一下linux系统所有进程占用内存大小的和。

#!/bin/bash
sum=0
for n in `ps aux |grep -v 'RIME COMMAND'|awk '{print $6}'`
do
	sum=$[$sum+$n]
done
echo $sum
ps aux  获取所有进程
grep -v 'TIME COMMAND' 不包含这行
awk '{print $6}' 只取rss这列
$[] $(()) :它们是一样的,都是进行数学运算的。

5 .找到/123目录下所有后缀名为.txt的文件

  1. 批量修改.txt为.txt.bak
  2. 把所有.bak文件打包压缩为123.tar.gz
  3. 批量还原文件的名字,即把增加的.bak再删除
#!/bin/bash
find /123/ -type f -name "*.txt" >/root/txt.list

for n in `cat /root/txt.list`
	mv $f $f.bak
done

for n in `cat /root/txt.list`
	echo $n
done > /tmp/txt.bak.list

tar -zcvf 123.tar.gz `cat /root/txt.bak.list`

for n in `cat /root/txt.list`
do mv $n.bak $n
done

9.把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。

#!/bin/bash
sed -n '1,5'p 1.txt |sed '/[a-zA-Z]/d'
sed '1,5d' 1.txt |sed '1,5s/[a-zA-Z]//g'
第一个sed是删除包含字母的行
第二个sed是删除前5行并对剩下的从1行到5行开始将字母替换为空并输出

10.用shell打印下面这句话中字母数小于6的单词。

#! /bin/bash
c=(Bash also interprets a number of multi-character options)
for i in ${c[@]}
do
        if [ ${#i} -le 6 ]
        then
                echo $i
        fi
done
${数组名[下标]},下标从0开始,下标为*或@代表整个数组内容
获取数组长度格式:${#数组名[*或@]}
-eq     : 是否相等
-ne     : 是否不等
-gt     : 是否大于
-lt     : 是否小于
-ge     :大于或等于
-le    :小于或等于      

15.请仔细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。

10 31 53 77 105 141 …….

#! /bin/bash
# 观察规律可知:差值是 21+1,22+2,23+4,24+8,...
x=10
y=21
for i in `seq 0 15`
do
	echo $x
	x=$[$x+$y]
	y=$[$y+2**$i]
done
seq 用于生成从一个数到另一个数之间的所有整数。
用法:seq [选项]... 尾数
 或:seq [选项]... 首数 尾数
 或:seq [选项]... 首数 增量 尾数

选项:

     -f, --format=FORMAT      use printf style floating-point FORMAT
     -s, --separator=STRING   use STRING to separate numbers (default: \n)
    -w, --equal-width        equalize width by padding with leading zeroes

19.写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10。

cat ~/.bash_history |sort | uniq -c | sort -n -r |head

21.计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字。
例如a.txt内容如下:
12aa*lkjskdj
alskdflkskdjflkjj
输出结果:
2
0
sum:2

#!/bin/bash
sum=0
while read line
do
      line_n=`echo $line| sed 's/[^0-9]//g'|wc -L`
      echo $line_n
      sum=$[$sum+$line_n]
done < $1
echo "sum:"$sum

$$ ——Shell本身的PID(ProcessID) 
$! ——Shell最后运行的后台Process的PID 
$? ——最后运行的命令的结束代码(返回值) 
$- ——使用Set命令设定的Flag一览 
$* ——所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$@ ——所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$# ——添加到Shell的参数个数 
$0 ——Shell本身的文件名 
$1~$n ——添加到Shell的各参数值。$1是第1参数、$2是第2参数…。```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值