每天练习50个shell
1、統(tǒng)計(jì)日志每天IP訪問量前十
awk '{print $1}' 1.log | sort -n | uniq -c | sort -n
解釋:
(1)awk 命令在分段方面比較有優(yōu)勢,這里的{print $1}將第一段打印出來,awk可以用-F指定分隔符,如果不指定分隔符,默認(rèn)就以空白字符(比如空格、tab等),本題中,IP地址就是第一段。
(2)sort 命令就是排序,-n選項(xiàng)表示以數(shù)字的形式排序。如果不加-n,則以ASCII排序,本題的IP地址用數(shù)字的形式排序更易區(qū)分。
(3)uniq 命令用來去重復(fù),一個(gè)文本如果有多行內(nèi)容是一模一樣的,就使用uniq命令將相同的內(nèi)容刪除,只保留一行。-c選項(xiàng)作用是計(jì)算重復(fù)的行數(shù)。所以,uniq -c 的作用正好就統(tǒng)計(jì)了ip的訪問量。不過,要注意,uniq去重要在排序之后進(jìn)行。
(4)最后的sort -n意思是按訪問量大小來排序,請求量越大的ip排在越后面。如果加一個(gè)-r選項(xiàng),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地址作為數(shù)組的下標(biāo),每發(fā)現(xiàn)一個(gè)相同的IP地址,就統(tǒng)計(jì)數(shù)量加1;當(dāng)awk遍歷日志文件1.log 完畢,再循環(huán)輸出數(shù)組 sum 的結(jié)果,要注意數(shù)組的下標(biāo)是 ip地址。
后面的 head -n 5 是為了輸出出現(xiàn)訪問次數(shù)最高的5個(gè)訪問ip地址。
2.計(jì)算linux系統(tǒng)所有進(jìn)程占用內(nèi)存大小和
top或者ps可以獲取每個(gè)進(jìn)程大內(nèi)存使用大小。獲得大小之后,通過一個(gè)循環(huán)計(jì)算他們的和了。
grep Pss /proc/[0-9]*/smaps | awk '{sum+=$2};END{print sum}'
(1)grep 命令可以遍歷目錄里的文件,然后將符合匹配字符的行抓取出來;
(2)awk 命令遍歷grep 輸出的結(jié)果,統(tǒng)計(jì)進(jìn)程使用內(nèi)存的和。
(3)在 /proc 目錄下,有很多和進(jìn)程有關(guān)的數(shù)據(jù),讀者可以自己去研究一下。
需要注意的是,全部進(jìn)程占用的內(nèi)存并不等于 free 命令所顯示的 “used memory”,因?yàn)椤皍sed memory”不僅包含了進(jìn)程所占用的內(nèi)存,還包含cache/buffer以及kernel動態(tài)分配的內(nèi)存等等
3.批量修改.txt文件未.txt.bak,并打包所有的.bak文件為123.tar.gz,然后再批量還原文件名。
#用到的命令:
find / -maxdepth 1 -type f -name "*.txt" > /tmp/file.txt
#循環(huán)逐行讀取/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)如果只是遍歷目錄,找出某種文件,然后修改一下文件名,其實(shí)一條命令就可以搞定:
find /usr/local/sbin/work -type f -name "*.txt" -print0 | xargs -d '\0' mv {} {}.bak
要注意,find 命令的查找路徑需要使用絕對路徑,不要用相對路徑。如果用 xargs 命令接在后面,則用 -print0 選項(xiàng),將某些包含空格的特殊文件名,也包含在內(nèi),不會處理錯(cuò)誤。
(2)腳本中的 while 循環(huán)這種方式其實(shí)也是很常見的,將結(jié)果臨時(shí)保存在一個(gè)文件中,然后再通過while 循環(huán)讀取處理。
(3)大家看到腳本中多次使用 /tmp/file.txt 這個(gè)文件了吧。將 .txt 結(jié)尾的文件保存到一個(gè)文件中,這種辦法就恨到地解決了我們在習(xí)題分析中提出的第3個(gè)問題啦。
(4)我的所有.txt 結(jié)尾的文件都在 /usr/local/src/sbin/work 目錄。
? 如果你沒有 .txt 結(jié)尾的文件,可以用下面的命令生成一堆,用來做實(shí)驗(yàn):
for i in seq 30;do touch $i.txt;done
4.檢測端口服務(wù)
判斷本機(jī)的80端口是否開啟著。
檢測腳本:
cat check_80.sh
#!/bin/bashbr/>ma="936172842@qq.com"
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
轉(zhuǎn)載于:https://blog.51cto.com/13120271/2317352
總結(jié)
以上是生活随笔為你收集整理的每天练习50个shell的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven,gradle本地缓存位置
- 下一篇: 对01背包的分析与理解(图文)