每天练习50个shell

1、统计日志每天IP访问量前十

awk '{print $1}' 1.log | sort -n | uniq -c | sort -n

解释:
(1)awk 命令在分段方面比较有优势,这里的{print $1}将第一段打印出来,awk可以用-F指定分隔符,如果不指定分隔符,默认就以空白字符(比如空格、tab等),本题中,IP地址就是第一段。
(2)sort 命令就是排序,-n选项表示以数字的形式排序。如果不加-n,则以ASCII排序,本题的IP地址用数字的形式排序更易区分。
(3)uniq 命令用来去重复,一个文本如果有多行内容是一模一样的,就使用uniq命令将相同的内容删除,只保留一行。-c选项作用是计算重复的行数。所以,uniq -c 的作用正好就统计了ip的访问量。不过,要注意,uniq去重要在排序之后进行。
(4)最后的sort -n意思是按访问量大小来排序,请求量越大的ip排在越后面。如果加一个-r选项,sort -nr,就是倒序排序。
或者

awk '{sum[$1]+=1};END{for(a in sum)print(sum[a],a)}' 1.log | sort -nr|head -n 5

解释:
这条命令中$1 就表示日志中的IP地址,用IP地址作为数组的下标,每发现一个相同的IP地址,就统计数量加1;当awk遍历日志文件1.log 完毕,再循环输出数组 sum 的结果,要注意数组的下标是 ip地址。
后面的 head -n 5 是为了输出出现访问次数最高的5个访问ip地址。

2.计算linux系统所有进程占用内存大小和
top或者ps可以获取每个进程大内存使用大小。获得大小之后,通过一个循环计算他们的和了。

grep Pss /proc/[0-9]*/smaps | awk '{sum+=$2};END{print sum}'

(1)grep 命令可以遍历目录里的文件,然后将符合匹配字符的行抓取出来;
(2)awk 命令遍历grep 输出的结果,统计进程使用内存的和。
(3)在 /proc 目录下,有很多和进程有关的数据,读者可以自己去研究一下。
需要注意的是,全部进程占用的内存并不等于 free 命令所显示的 “used memory”,因为“used memory”不仅包含了进程所占用的内存,还包含cache/buffer以及kernel动态分配的内存等等

3.批量修改.txt文件未.txt.bak,并打包所有的.bak文件为123.tar.gz,然后再批量还原文件名。

#用到的命令:
find / -maxdepth 1 -type f -name "*.txt" > /tmp/file.txt
#循环逐行读取/tmp/file.txt文件修改文件名为txt.bak
while read line;
do
mv $line $line.bak
done</tmp/file.txt
#压缩打包
d='data +%Y%m%d%H%M%S'
mkdir /tmp/123$d
for f in 'cat /tmp/file.txt'
do
cp $f.bak /tmp/123
$d
done
cd /tmp
tar czf 123.tar.gz ./123_$d
for f in 'cat /tmp/file.txt';
do
mv $f.bak $f
done

(1)如果只是遍历目录,找出某种文件,然后修改一下文件名,其实一条命令就可以搞定:

find /usr/local/sbin/work -type f -name "*.txt" -print0 | xargs -d '\0' mv {} {}.bak

要注意,find 命令的查找路径需要使用绝对路径,不要用相对路径。如果用 xargs 命令接在后面,则用 -print0 选项,将某些包含空格的特殊文件名,也包含在内,不会处理错误。

(2)脚本中的 while 循环这种方式其实也是很常见的,将结果临时保存在一个文件中,然后再通过while 循环读取处理。
(3)大家看到脚本中多次使用 /tmp/file.txt 这个文件了吧。将 .txt 结尾的文件保存到一个文件中,这种办法就恨到地解决了我们在习题分析中提出的第3个问题啦。
(4)我的所有.txt 结尾的文件都在 /usr/local/src/sbin/work 目录。
​ 如果你没有 .txt 结尾的文件,可以用下面的命令生成一堆,用来做实验:

for i in seq 30;do touch $i.txt;done

4.检测端口服务
判断本机的80端口是否开启着。

检测脚本:
cat check_80.sh

#!/bin/bashbr/>ma="[email protected]"
if netstat -lntp | grep -q ':80'
then
exit 0
fi
/usr/local/apache2.4/bin/apachectl restart >/dev/null 2>/dev/null
python /usr/local/sbin/work/mail.py $ma "port_80" "prot 80 down"

n='pgrep -l httpd | wc -l'
echo $n
if [$n -eq 0];then
/usr/local/apache2.4/bin/apachectl start 2>/tmp/http.error
fi

if [-s /tmp/http.error]
then
python /usr/local/sbin/work/mail.py $ma "apache_restart_wrong" "'cat /tmp/http.error'"
fi

猜你喜欢

转载自blog.51cto.com/13120271/2317352