Shell?AWK編程的基本介紹和使用詳解
1、AWK介紹
(1)AWK概述
AWK是一種處理文本文件的語言,是一個強大的文本分析工具。
AWK可以看成一門獨立的語言,它擁有語言的基本特征,換句話說AWK可以寫出極其繁瑣和復(fù)雜的程序,AWK的語法比Shell的語法還難以接收。但絕大多數(shù)情況下,我們并不需要用AWK寫過于復(fù)雜的東西,建議能用Shell處理的需求就不用AWK來解決。
當(dāng)用AWK處理需求遠要比Shell處理簡單的多的時候,我們就用AWK來解決。
AWK也是用來截取列信息的,它比Shell中的cut
命令更先進,比如對空格作為分隔符的處理。
(2)printf
格式化輸出
在學(xué)習(xí)AWK之前,我們要先學(xué)習(xí)一下printf
格式化輸出命令,這個命令是AWK基本輸出中必須要用到的一個命令。
AWK的標(biāo)準(zhǔn)輸出支持print
命令和printf
命令,這兩個命令在AWK當(dāng)中基本作用是一樣的,但是Linux命令中只支持printf
命令,如下:
# 在Linux中執(zhí)行print命令和printf命令 [root@192 ~]# print # 報錯命令沒有找到 -bash: print: command not found [root@192 ~]# printf # 提示你命令格式寫錯了 printf: usage: printf [-v var] format [arguments]
我們可以看到Linux系統(tǒng)中只支持printf
命令,所以我們這里就先學(xué)習(xí)一下printf
命令。
(3)printf
命令說明
[root@localhost ~]# printf '輸出類型輸出格式' 輸出內(nèi)容 輸出類型: %ns:輸出字符串。n是數(shù)字指輸出幾個字符。 %ni:輸出整數(shù)。n是數(shù)字指輸出幾個數(shù)字。 %m.nf:輸出浮點數(shù)。m和n是數(shù)字,指輸出的總位數(shù)和小數(shù)位數(shù)。如%8.2f代表共輸出8位數(shù),其中2位是小數(shù),6位是整數(shù)。 輸出格式: \a:輸出警告聲音。 \b:輸出退格鍵,也就是Backspace鍵。 \f:清除屏幕。 \n:換行。 \r:回車,也就是Enter鍵。 \t:水平輸出退格鍵,也就是Tab鍵 \v:垂直輸出退格鍵,也就是Tab鍵。
練習(xí),使用如下文本:
ID Name Python Linux MySQL Java 1 Tangs 88 87 86 85.55 2 Sunwk 99 98 97 96,66 3 Zhubj 77 76 75 74.44 4 Shahs 66 65 64 63.33
執(zhí)行printf
命令:
[root@localhost tmp]# printf '%s' $(cat student.txt)
說明:printf
命令后是沒有辦法直接寫參數(shù)的,也就是不能直接加文件名來讀取文件的內(nèi)容,printf
命令支持的是其他命令結(jié)果的輸出,交給printf
命令來處理。所以說printf
命令很少單獨使用,一般都放在AWK當(dāng)中來使用,這樣更加合理,否則就和上邊一樣,看起來很難受。
結(jié)果:
[root@localhost tmp]# printf '%s' $(cat student.txt)
IDNamePythonLinuxMySQLJava1Tangs88878685.552Sunwk99989796,663Zhubj77767574.444Shahs66656463.33[root@192 tmp]#
我們可以看到上面的結(jié)果非常的爛,他是把所有的內(nèi)容一個字符緊接著一個字符的輸出,中間沒有空格或者回車。
這就是printf
命令,如果不指定輸出的格式,則會把所有輸出內(nèi)容連在一起輸出。其實文本的輸出本身就是這樣的,cat
等文本輸出命令之所以可以按照漂亮的格式輸出,那是因為cat
命令已經(jīng)設(shè)定了輸出格式。
那么為了讓printf
輸出合理的格式,就需要手動自定義自己需要的格式。
printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt)
說明:就是輸出一個字符串(%s
),后邊加上一個制表符(tab
鍵)隔開(\t
),這樣一共有6列,寫6個%s\t
,然后每一行最后加上一個回車(\n
)。
執(zhí)行命令結(jié)果如下:
[root@localhost tmp]# printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt)
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
注意:'%s\t %s\t %s\t %s\t %s\t %s\t \n'
中的空格是沒有意思的,寫多少都行,只是方便自己看,printf
命令,只認\n
、 \t
等輸出格式。
如果不想把成績當(dāng)成字符串輸出,而是按照整型和浮點型輸出,執(zhí)行如下命令:
[root@192 tmp]# printf '%i\t %s\t %i\t %i\t %i\t %8.2f\t \n' $(cat student.txt | grep -v "Name") 1 Tangs 88 87 86 85.55 2 Sunwk 99 98 97 96.66 3 Zhubj 77 76 75 74.44 4 Shahs 66 65 64 63.33
這個例子不是很好,但一定要把標(biāo)題顧慮掉,否則會出現(xiàn)如下效果,標(biāo)題都被變成了整型數(shù)據(jù)。
[root@localhost tmp]# printf '%i\t %s\t %i\t %i\t %i\t %8.2f\t \n' $(cat student.txt) -bash: printf: ID: invalid number -bash: printf: Python: invalid number -bash: printf: Linux: invalid number -bash: printf: MySQL: invalid number -bash: printf: Java: invalid number 0 Name 0 0 0 0.00 1 Tangs 88 87 86 85.55 2 Sunwk 99 98 97 96.66 3 Zhubj 77 76 75 74.44 4 Shahs 66 65 64 63.33
2、AWK的基本使用
(1)AWK命令說明
[root@localhost ~]# awk '條件1{動作1} 條件2{動作2} ...' 文件名 條件(Pattern): 一般使用關(guān)系表達式作為條件。這些關(guān)系表達式非常多,具體看下面一點。 簡單舉例: x>10:判斷變量x是否大于10。 x==y:判斷變量x是否等于變量y 。 A~B:判斷字符串A中是否包含能匹配B表達式的子字符串。 A!~B:判斷字符串A中是否不包含能匹配B表達式的子字符串。 動作(Action): 格式化輸出。 流程控制語句。
提示:先判斷條件是否成立,在進行對應(yīng)動作??梢詻]有條件直接寫動作,如果沒有條件,則直接執(zhí)行動作。
(2)AWK命令使用
1)基本使用
使用如下文本:
ID Name Python Linux MySQL Java 1 Tangs 88 87 86 85.55 2 Sunwk 99 98 97 96,66 3 Zhubj 77 76 75 74.44 4 Shahs 66 65 64 63.33
執(zhí)行命令:
awk '{printf $2 "\t" $3 "\t" $6 "\t" "\n"}' student.txt
結(jié)果:
[root@localhost tmp]# awk '{printf $2 "\t" $3 "\t" $6 "\t" "\n"}' student.txt
Name Python Java
Tangs 88 85.55
Sunwk 99 96.66
Zhubj 77 74.44
Shahs 66 63.33
說明:
- AWK的動作條件是需要用單引號括起來的,所以在動作條件中的
printf
命令中定義的輸出格式時,單引號就需要改換成雙引號了,這里要注意。 - 沒有條件就是每一行都處理。
- AWK的主要動作就是用
printf
命令來輸出的。 - AWK中可以直接添加文本文件,來獲取文件中所需內(nèi)容。
這里在補充一下print
命令和printf
命令用法差不多,print
命令自帶換行符,但是Linux系統(tǒng)不支持print
命令。
# 使用`print`命令就不需要加上\n換行符了。 [root@localhost tmp]# awk '{print $2 "\t" $3 "\t" $6 "\t"}' student.txt Name Python Java Tangs 88 85.55 Sunwk 99 96.66 Zhubj 77 74.44 Shahs 66 63.33
2)處理分隔符是空格的情況
看磁盤情況的df
命令的結(jié)果中,數(shù)據(jù)之間的分隔符是空格,用cut
命令是處理不了的。
如下:
# 查看磁盤情況 [root@localhost tmp]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 19G 2.1G 16G 12% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 240M 34M 194M 15% /boot # 獲取第二列信息 [root@localhost tmp]# df -h | cut -f 2 Filesystem Size Used Avail Use% Mounted on /dev/sda3 19G 2.1G 16G 12% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 240M 34M 194M 15% /boot
使用AWK解決需求,獲取磁盤情況的第1列和第5列的信息。
[root@localhost tmp]# df -h | awk '{printf $1 "\t" $5 "\t" "\n"}' Filesystem Use% /dev/sda3 12% tmpfs 0% /dev/sda1 15%
3)綜合練習(xí)
獲取下面信息中根分區(qū)的占有率12。
[root@localhost tmp]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 19G 2.1G 16G 12% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 240M 34M 194M 15% /boot
執(zhí)行命令:
[root@localhost tmp]# df -h | grep "dev/sda3" | awk '{print $5}' | cut -d "%" -f 1 12
到此這篇關(guān)于Shell AWK編程的基本介紹和使用詳解的文章就介紹到這了,更多相關(guān)Shell AWK使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell編程中for循環(huán)語句的實現(xiàn)過程及案例
Bash?Shell中主要提供了三種循環(huán)方式:for、while和until,下面這篇文章主要給大家介紹了關(guān)于shell編程中for循環(huán)語句的實現(xiàn)過程及案例,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04解決VirtualBox中Ubuntu 14.04屏幕分辨率不能設(shè)置的問題
下面小編就為大家?guī)硪黄鉀QVirtualBox中Ubuntu 14.04屏幕分辨率不能設(shè)置的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05