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