简单Shell命令及脚本汇总
一、统计Nginx日志中访问量最多的IP
cat access.log |awk '{print $1}'|sort|uniq -c|sort -r
(1)先看下Nginx日志内容格式
我这个是默认日志格式,可以看到访问IP在第一列
[root@localhost logs]# head -n 1 access.log 192.168.5.2 - - [04/Nov/2021:09:02:11 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"
(2)统计结果
[root@localhost logs]# cat access.log |awk '{print $1}'|sort|uniq -c|sort -r 81700 192.168.5.2 3 127.0.0.1
awk 默认以空格分隔,所以直接打印第一列。接着进行sort排序,再使用uniq检查重复出现的行,加上-c统计重复出现的行的次数,在列旁边显示。最后因为是要从大到小排序,所以使用sort -r进行倒序
二、修改文本指定行内容
sed –i ‘23s/test/tset/g’ test.txt
-i 使修改生效,23指第23行,s指替换字符,搜索test字符串并修改为tset
三、修改文本指定行指定列内容
sed –n ‘25p’ /web.log | cut –d “ ” –f3 head –n25 /web.log | tail –n1 | cut –d “ ” –f3 awk –F “ ” ‘NR==23{print $3}’ /web.log
sed -》25p打印第25行
cut -d指定分隔符,-指定列
awk -F指定分隔符,NR指行数,另外NF指列数
四、删除文件开始三行
sed –i ‘1,3d’ /tmp/*.tmp
五、打印100以内质数
质数:除了1和本身外,没有其他数字可以除尽,例如2,3,5,7,11,13。注意1是非质数
#!/bin/bash
#for循环读取2到100 for((i=2;i<100;i++)) do k=1 #k做标记,k=1表示质数,k=0表示非质数 for((j=2;j<$i;j++)) #将i从2开始除起,一直到i的前一位 do if [ $(($i%$j)) -eq 0 ] #i除以j能除尽,说明这个说可能不是质数 then k=0 #k置为0,表示非质数 break #只要有一次能除尽,我们就能判断这个不是质数,可以直接跳出本次for循环 fi done if [ $k -eq 1 ] #k为1,说明$i%j没有一次是可以除尽的,可以判断出这个i是质数 then echo $i #打印质数 fi done
其中:if [ $(($i%%j)) -eq 0 ]的(())用来进行计算,而$(())用来取计算后的结果值
六、复制当前目录下指定大小的文件到指定目录
find ./* -size +10M |xargs -i cp -rf {} ./bp/
-i 表示 find 传递给xargs的结果 由{}来代替
七、批量修改文件后缀
#!/bin/bash fileinfo=`find ./ -name "*.xtx"` for i in $fileinfo do mv $i ${i%xtx}txt done
mv $i ${i%xtx}txt 其实就是对字符串进行取模,删掉原来的后缀,格式是${var%string},得到的值就是var值去掉string内容的值,后面跟txt就是自动拼接txt后缀。
八、将1到10数字相加
#!/bin/bash b=0 for((i=1;i<=10;i++)) do b=$((b+i)) done echo $b
九、echo 命令获取字符串变量的一部分
echo ${variable:x:y}