nginx过滤日记出来;
awk '{print $1}' access.log|sort -n |uniq -c |sort -nr|head -n3
[root@localhost_002 logs]# awk '{print $1}' access.log |sort -n|uniq -c |sort -nr |head -n3
54 127.0.0.1
38 192.168.149.135
1 192.168.149.129
nginx打印一分钟前的日记内容;
[root@localhost_002 logs]# time=`date -d "-1 min" +%H:%M`
[root@localhost_002 logs]# for i in `tail /usr/local/nginx/logs/access.log|grep "$time"|awk '{print $1}'|sort -n|uniq -c|awk '{print $2}'`;do echo $i >>/tmp/iplist.txt;done
[root@localhost_002 logs]# cat /tmp/iplist.txt
127.0.0.1
127.0.0.1
127.0.0.1
内容: tail /usr/local/nginx/logs/access.log|grep "$time"|awk '{print $1}'|sort -n|uniq -c
[root@localhost_002 logs]# cat nginx.sh
#!/bin/bash
time=`date -d "-1 min" +%H:%M`
for i in `tail /usr/local/nginx/logs/access.log|grep "$time"|awk '{print $1}'|sort -n|uniq -c|awk '{print $2}'`
do
echo $i >> /tmp/ip.list
done
[root@localhost_002 logs]# cat /tmp/ip.list
127.0.0.1
2:判断当前的shell是不是/bin/bash,并列出;
[root@localhost_002 shell2]# cat 2.sh
#!/bin/bash
if [ "$SHELL" = "/bin/bash" ]
then
echo "you loging shell is the bash " \n
echo "SHELL IS :$SHELL"
else
echo "you login shell not bash,but $SHELL"
fi
if [ -f "/etc/shadow" ]
then
echo "The computer password"
else
echo "not password"
(3):统计/root/目录下有多少文件,并显示出来;依次向下面的文件或者目录问好;
[root@localhost_002 shell2]# cat 3.sh
#!/bin/bash
cd /root/
for i in /root/*
do
echo hello, $i
done
count=`ls -l /root/*|grep '^-'|wc -l`
echo file_count: $count
(4):传递两个整数给脚本a 和 b,让脚本分别计算着两个数的和 差 积 除;
[root@localhost_002 shell2]# cat 4.sh
#!/bin/bash
a=$1
b=$2
[ -z $a ] && echo "please input number" && exit 1 #判断$1 是否为空;
[ -z $b ] && echo "please input \$2 number" && exit 2 #判断$2 是否为空;
[ $# -ne 2 ] && echo "--please num1 mum2" && exit 3 #判断脚本参数是否是2;
echo "$a + $b = $(($a+$b))"
echo "$a - $b = $(($a - $b))"
echo "$a * $b = $(($a*$b))"
echo "$a / $b = $(($a/$b))"
注释: if [ ]; then echo " "; elif [ ]; then echo ""; else echo " ";fi
-f 如果文件存在,则......
-d 如果目录存在,则......
-s 如果文件存在且非空,则..... -r 文件可读 -w 文件可写 -x 文件可执行
-z 如果变量为空,则怎么.... if [ -z $a ] === if [ $a ] -n 如果变量非空,则....... if [ -n $a ]
-gt(大于) -ge(大于等于) lt(小于) le(小于等于) -eq(等于) -ne(不等于)
if [ $# -ne 2 ]; then echo " "; else echo " "; fi #传递脚本参数;
数组介绍: A=(a b c d e) echo {$A[@]} ===== echo {$A[*]}
定义数组: A=(a b c d e)
查看数组内容: echo ${A[@]} ======== echo ${A[*]}
查看参数个数: echo ${#A[@]}
查看第几个参数: echo ${A[1]} 查看第一个参数,显示b,因为是从0开始的;
unset a 删除数组;
注释: $! $? $# $$ 脚本运行的当前进程的PID号;
linux中,shell脚本 $( ) ${ } $(( )) ` `(反引号) ' '(单引号) " "(双引号)
在linux,引用一个命令是使用单引号, time=`date -d "-1 min" +%H:%M` echo $time
然后也可以使用 $( )来引用一个命令, time=$(date -d "-d min" +%H:%M) echo $time
所以: 反引号 ` ` ==== $( )
2、一般而言, echo ${A} 和 echo $A用法是一样的,
[root@localhost_002 shell2]# A=yuanhh
[root@localhost_002 shell2]# echo ${A}B
yuanhhB
[root@localhost_002 shell2]# echo "$A"B
yuanhhB
双引号表示原来字符的意义;
单引号是脱义字符; '' ==== \
[root@localhost_002 shell2]# echo '$A'B
$AB
[root@localhost_002 shell2]# echo \$AB
$AB
注释:如上, echo ${A}B ==== echo "$A"B 都表示报错原来变量的含义;
注释:单引号 ' '和脱义字符 \ 的作用是一样,使特殊符号恢复本来的含义, echo '$A'B ==== echo \$AB
3、$(( )) 与整数运算 echo $((2*3))
首先需要了解下bash中的运算字符: + - * /(除) 余(%)
[root@localhost_002 shell2]# echo $((4+6))
10
[root@localhost_002 shell2]# echo $((5*6))
30
[root@localhost_002 shell2]# a=2;b=4;c=5
[root@localhost_002 shell2]# echo $((a+b*c))
22
注释: $(( ))还可以用做将其他进制转换成十进制显示出来; echo $((2#110))
[root@localhost_002 shell2]# echo $((2#100))
4
[root@localhost_002 shell2]# echo $((16#100))
256
[root@localhost_002 shell2]# echo $((8#100))
64
3:写一个脚本:求1到100的和:
[root@localhost_002 shell2]# cat 6.sh
#!/bin/bash
sum=0
for i in `seq 1 100`
do
sum=$[$sum+$i]
done
echo $sum
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
4:实用脚本:判断192.168.149.0/24这个网段内在用的IP地址;
ping -c1 # -c表示ping的次数,后面跟数字, -w1 表示测试时间, 1秒后不管成败都跳过;
/dev/null 是linux系统里的一个黑洞,永远写不满 2>&1 表示把正确和错误的信息都写入到黑洞里;
2>&1 将标准错误重定向到标准输出,而标准输出已经到/dev/null,所以错误的也会去/dev/null;
理解:实际上,应该等同于这样: 1>/dev/null 2>/dev/null ,默认情况下就是1,标准输出,所以一般都省略。 而&符号,后面接的是必须的文件描述符。不能写成2>1,这样就成了标准错误重定向到文件名为1的文件中了,而不是重定向标准错误到标准输出中。所以这里就是:标准输出重定向到了/dev/null,而标准错误又重定向到了标准输出,所以就成了标准输出和标准错误都重定向到了/dev/null
对于&1,文件描述符1,1表示标准输出 stdout 对于2表示标准错误,sdterr
#!/bin/bash
for i in `seq 1 254`
do
ping -c1 -w1 192.168.149.$i >/dev/null 2>&1
if [ $? eq 0 ]
then
echo "192.168.149.$i is up" >> /tmp/up.list
else
echo "192.168.149.$i is down" >> /tmp/down.list
fi
done