1. 程式人生 > >nginx的兩個小問題

nginx的兩個小問題

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