简单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}
原文地址:https://www.cnblogs.com/biaopei/p/15549577.html