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