1、Printf簡介nginx
Printf的功能是格式和打印數據(format and print data),即把標準輸出的內容,經過printf命令轉換成另類的格式輸出。web
2、echo與printf 殊途同歸之妙shell
echo命令能夠實現的功能,printf命令一樣能夠實現,二者之間的微妙之處在於printf+awk能夠實現更強大的功能,對於echo能夠說printf更勝一籌。數組
1)標準輸出bash
[root@keepalived_master scripts]# echo "hello world"服務器
hello worldapp
[root@keepalived_master scripts]# printf "hello world\n"tcp
hello worldide
注:printf語句若不加」\n」,默認輸出不換行。spa
2)換行輸出
[root@keepalived_master scripts]# echo -e "hello \nworld"
hello
world
[root@keepalived_master scripts]# printf "hello \nworld\n"
hello
world
注:echo語句使用」-e」參數,使其」\n」具備特殊意義,實現字符換行輸出。
3)不換行輸出
[root@keepalived_master scripts]# echo -n "hello world"
hello world[root@keepalived_master scripts]#
[root@keepalived_master scripts]# printf "hello world"
hello world[root@keepalived_master scripts]#
注:echo語句默認是換行輸出,使用」-n」選項可用實現不換行輸出。
4)字符與字符間距
[root@keepalived_master scripts]# echo -e "hello \tworld"
hello world
[root@keepalived_master scripts]# printf "hello \tworld\n"
hello world
注:經過」\t」參數,可用實現字符之間有一個tab建的距離。
5)判斷上一條命令執行的結果是否正確
[root@keepalived_master scripts]# ll
total 8
-rw-r--r-- 1 root root 1876 Sep 12 13:00 mac.txt
-rw-r--r-- 1 root root 594 Sep 12 13:08 user_mac_forward.sh
[root@keepalived_master scripts]# echo $?
0
[root@keepalived_master scripts]# ll
total 8
-rw-r--r-- 1 root root 1876 Sep 12 13:00 mac.txt
-rw-r--r-- 1 root root 594 Sep 12 13:08 user_mac_forward.sh
[root@keepalived_master scripts]# printf "$? \n"
0
注:經過」$?」判斷上一條命令執行後返回的結果,0:正確,1-255:錯誤。
6)輸出變量的值
[root@keepalived_master scripts]# hello=world
[root@keepalived_master scripts]# echo $hello
World
[root@keepalived_master scripts]# hello=very
[root@keepalived_master scripts]# printf "$hello \n"
very
7)讓字符串帶顏色輸出
提示:爲了讓結果更明顯,以shell腳本的方式批量執行。
[root@keepalived_master scripts]# cat echo_color.sh
#!/bin/bash
echo -e "\033[31mplease input one number: \033[0m" -->紅色
echo -e "\033[32mplease input one number: \033[0m"-->綠色
echo -e "\033[33mplease input one number: \033[0m"-->×××
echo -e "\033[34mplease input one number: \033[0m"-->藍色
echo -e "\033[35mplease input one number: \033[0m"-->粉色
echo -e "\033[36mplease input one number: \033[0m"-->青色
echo -e "\033[37mplease input one number: \037[0m"-->白色
[root@keepalived_master scripts]# cat printf_color.sh
#!/bin/bash
printf "\033[31mplease input one number: \033[0m\n"
printf "\033[32mplease input one number: \033[0m\n"
printf "\033[33mplease input one number: \033[0m\n"
printf "\033[34mplease input one number: \033[0m\n"
printf "\033[35mplease input one number: \033[0m\n"
printf "\033[36mplease input one number: \033[0m\n"
printf "\033[37mplease input one number: \033[0m\n"
注:讓字符輸出時帶有顏色,可讓結果更加明顯;在編寫shell腳本時,常常用到此方法,建議你們掌握。
3、printf命令對比echo擁有的特性
1)從命令行引用傳值
[root@keepalived_master scripts]# printf "%s %s %s %s\n" Are you happy today
Are you happy today
注:Are you happy today分別被%s->Are %s->you %s->happy %s->today引用,終端輸出的結果即爲Are you happy today
2)格式化輸出
[root@keepalived_master scripts]# printf "%s %10s %10s %10s\n" Are you happy today
Are you happy today
注:%s字符之間分隔的空間,%10s表示分隔10個字符的間距。
3)使用前導零擴展%d
[luofeng@CNC_BJ_009_188 ~]$ for ip in `seq 00 20`;do printf "%d \n" $ip;done
0
1
2
3
4
5
6
----省略----
注:上述命令使用for循環00-20的數字,由於%d默認精度爲1,printf打印在終端的結果爲0-20。
[luofeng@CNC_BJ_009_188 ~]$ for ip in `seq 00 99`;do printf "%02d \n" $ip;done
00
01
02
03
04
05
06
07
----省略-----
注:」%02d」使其默認的精度從1變爲2,printf打印的結果便爲咱們看到的00-20,在數字1前置0.
d:接受整數值並將它轉換爲有符號的十進制符號表示法。精度指定顯示的最小數字位數。若是值轉換後能夠用更少的位數來表示,將使用前導零擴展。缺省精度是 1。
4、Awk示例分享
注:首先分享一些工做中經常使用awk的實例
1)經過邏輯運算符「&&」與「||」,過濾文本內容
[root@keepalived_master ~]# awk '$1=="root" && $3==0' test.txt
root x 0 0 /root /bin/bash
注:過濾的內容中包含字符串,須要用雙引號「」。
$1...$n:表示第文本內容的第幾列,其中$1==root,$2==x,$3==0.....$n==$n。
&&:表示邏輯與,即知足條件第一列爲root,第三列爲0的行纔會被顯示。
[root@keepalived_master ~]# awk '$1=="sync" || $5=="/root"' test.txt
root x 0 0 /root /bin/bash
sync x 5 0 /sbin /bin/sync
operator x 11 0 /root /sbin/nologin
注:只要知足$1==「sync」或者$5==「/root」其中的一個過濾條件,文本內容標準輸出至終端。
||:表示邏輯或,即知足過濾條件任意一個,文本內容標準輸出。
2)經過比較運算符!=,==,>=,<=,>,<過濾文本內容
注:$3爲用戶的UID,知足過濾條件‘$3>500’的行,標準輸出到終端。
注:$3爲用戶的UID,知足過濾條件‘$3>500’的行,標準輸出到終端。
注:當知足條件」$4 <= 4」時,有8行內容標準輸出;而後運用邏輯與」&&」過濾」$4 != 0」的行,從圖中能夠看出結果,3行知足過濾條件。
3)Awk經常使用內置變量
$0 |
當前記錄,變量存放文件整行的內容。 |
$1~$n |
記錄文件當前行的第n列,字段間由FS分隔。 |
NF |
當前記錄中的字段個數,就是有多少列。 |
NR |
已經讀出的記錄數,就是行號,從1開始,若是有多個文件話,這個值也是不斷累加中。 |
FS |
輸入字段分隔符,默認是空格或Tab。 |
OFS |
輸出字段分隔符, 默認也是空格。 |
實例1:
[root@keepalived_master ~]# awk '$1 ~ /root/{print $0}' test.txt
root x 0 0 /root /bin/bash
[root@keepalived_master ~]# awk '$1 ~ /root/{print $1}' test.txt
root
注:經過終端顯示的結果能夠看出,知足過濾條件」$1 ~ /root」,$0輸出文件整行的內容,而$1輸出整行中第一列。
實例2:
[root@keepalived_master ~]# awk 'NR==2 {print $0}' test.txt
bin x 1 1 /bin /sbin/nologin
[root@keepalived_master ~]# awk '$3 >=10 && NR==20 {print $0}' test.txt
ntp x 38 38 /etc/ntp /sbin/nologin
[root@keepalived_master ~]# cat -n test.txt | grep 20
20 ntp x 38 38 /etc/ntp /sbin/nologin
注:NR記錄當前文件中的行號,其中bin用戶的行號爲2,知足過濾條件」NR==2」標準輸出,ntp用戶的UID大於10,同時知足過濾條件」Nr==20」,cat -n test.txt | grep 20證明了這一結論。
實例3:
注:經過」OFS=」\t」」指定了文件中列與列之間的距離,\t表示4個字符的距離,能夠看出兩條命令執行的結果有差別。
實例4:
1
2
3
4
|
[root@keepalived_master ~]# netstat -n | awk
'/^tcp/{++S[$NF]}END{for(key in S) print key,"\t",S[key]}'
TIME_WAIT
243
SYN_SENT
1
ESTABLISHED
58
|
注:此條命令在工做中經常使用,查看Linux服務器活動連接狀態,根據命令的返回結果,能夠推論出當前服務器負載狀況。
提示:
分析整條命令的含義:首先經過/^tcp/過濾出TCP的鏈接狀態,而後定義S[]數組;$NF表示最後一列,++S[$NF]表示數組中$NF的值+1,END表示在最後階段要執行的命令,經過for循環遍歷整個數組;最後print打印數組的鍵和值
提示:對於$NF還有不太明白朋友,能夠看看下列實例:
5、AWK+Printf完美結合
1)分享Web站點訪問日誌,以腳本的形式:
腳本1:
[root@keepalived_master ~]# cat analyze_web_log.sh
#!/bin/bash
# create author of cfwl
# create date of 2013-10-12
# scripts function analyze web site access log
# print web site log and sort
cat /application/nginx-1.2.9/logs/access.log | awk '{print $1,$4,$9,$19,$22}' |sort | uniq -c | sort -nr
腳本2:
[root@keepalived_master ~]# cat funtion_analyze_web_log.sh
#!/bin/bash
# create author of cfwl
# create date of 2013-10-12
# scripts function analyze web site access log
sh analyze_web_log.sh|
awk '
BEGIN{
print "----------------------------------------------------------------------------";
print "| Total | Access_IP | Access_Date | State | Access_browser |";
print "----------------------------------------------------------------------------";
}
{
printf "| %-5s | %-14s | %-11s | %-5s | %-15s |\n",$1,$2,$3,$4,$5,$6;
}
END{
print "----------------------------------------------------------------------------";
}'
注:執行結果
原文連接:http://cfwlxf.blog.51cto.com/3966339/1309242