<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
AWK是一種處理文字檔案的語言,是一個強大的文字分析工具。
AWK可以看成一門獨立的語言,它擁有語言的基本特徵,換句話說AWK可以寫出極其繁瑣和複雜的程式,AWK的語法比Shell的語法還難以接收。但絕大多數情況下,我們並不需要用AWK寫過於複雜的東西,建議能用Shell處理的需求就不用AWK來解決。
當用AWK處理需求遠要比Shell處理簡單的多的時候,我們就用AWK來解決。
AWK也是用來擷取列資訊的,它比Shell中的cut
命令更先進,比如對空格作為分隔符的處理。
printf
格式化輸出在學習AWK之前,我們要先學習一下printf
格式化輸出命令,這個命令是AWK基本輸出中必須要用到的一個命令。
AWK的標準輸出支援print
命令和printf
命令,這兩個命令在AWK當中基本作用是一樣的,但是Linux命令中只支援printf
命令,如下:
# 在Linux中執行print命令和printf命令 [root@192 ~]# print # 報錯命令沒有找到 -bash: print: command not found [root@192 ~]# printf # 提示你命令格式寫錯了 printf: usage: printf [-v var] format [arguments]
我們可以看到Linux系統中只支援printf
命令,所以我們這裡就先學習一下printf
命令。
printf
命令說明[root@localhost ~]# printf '輸出型別輸出格式' 輸出內容 輸出型別: %ns:輸出字串。n是數位指輸出幾個字元。 %ni:輸出整數。n是數位指輸出幾個數位。 %m.nf:輸出浮點數。m和n是數位,指輸出的總位數和小數位數。如%8.2f代表共輸出8位元數,其中2位是小數,6位是整數。 輸出格式: a:輸出警告聲音。 b:輸出退格鍵,也就是Backspace鍵。 f:清除螢幕。 n:換行。 r:回車,也就是Enter鍵。 t:水平輸出退格鍵,也就是Tab鍵 v:垂直輸出退格鍵,也就是Tab鍵。
練習,使用如下文字:
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
執行printf
命令:
[root@localhost tmp]# printf '%s' $(cat student.txt)
說明:printf
命令後是沒有辦法直接寫引數的,也就是不能直接加檔名來讀取檔案的內容,printf
命令支援的是其他命令結果的輸出,交給printf
命令來處理。所以說printf
命令很少單獨使用,一般都放在AWK當中來使用,這樣更加合理,否則就和上邊一樣,看起來很難受。
結果:
[root@localhost tmp]# printf '%s' $(cat student.txt)
IDNamePythonLinuxMySQLJava1Tangs88878685.552Sunwk99989796,663Zhubj77767574.444Shahs66656463.33[root@192 tmp]#
我們可以看到上面的結果非常的爛,他是把所有的內容一個字元緊接著一個字元的輸出,中間沒有空格或者回車。
這就是printf
命令,如果不指定輸出的格式,則會把所有輸出內容連在一起輸出。其實文字的輸出本身就是這樣的,cat
等文字輸出命令之所以可以按照漂亮的格式輸出,那是因為cat
命令已經設定了輸出格式。
那麼為了讓printf
輸出合理的格式,就需要手動自定義自己需要的格式。
printf '%st %st %st %st %st %st n' $(cat student.txt)
說明:就是輸出一個字串(%s
),後邊加上一個製表符(tab
鍵)隔開(t
),這樣一共有6列,寫6個%st
,然後每一行最後加上一個回車(n
)。
執行命令結果如下:
[root@localhost tmp]# printf '%st %st %st %st %st %st 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
注意:'%st %st %st %st %st %st n'
中的空格是沒有意思的,寫多少都行,只是方便自己看,printf
命令,只認n
、 t
等輸出格式。
如果不想把成績當成字串輸出,而是按照整型和浮點型輸出,執行如下命令:
[root@192 tmp]# printf '%it %st %it %it %it %8.2ft 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
這個例子不是很好,但一定要把標題顧慮掉,否則會出現如下效果,標題都被變成了整型資料。
[root@localhost tmp]# printf '%it %st %it %it %it %8.2ft 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
[root@localhost ~]# awk '條件1{動作1} 條件2{動作2} ...' 檔名 條件(Pattern): 一般使用關係表示式作為條件。這些關係表示式非常多,具體看下面一點。 簡單舉例: x>10:判斷變數x是否大於10。 x==y:判斷變數x是否等於變數y 。 A~B:判斷字串A中是否包含能匹配B表示式的子字串。 A!~B:判斷字串A中是否不包含能匹配B表示式的子字串。 動作(Action): 格式化輸出。 流程控制語句。
提示:先判斷條件是否成立,在進行對應動作。可以沒有條件直接寫動作,如果沒有條件,則直接執行動作。
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
執行命令:
awk '{printf $2 "t" $3 "t" $6 "t" "n"}' student.txt
結果:
[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
說明:
printf
命令中定義的輸出格式時,單引號就需要改換成雙引號了,這裡要注意。printf
命令來輸出的。這裡在補充一下print
命令和printf
命令用法差不多,print
命令自帶換行符,但是Linux系統不支援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
命令的結果中,資料之間的分隔符是空格,用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)綜合練習
獲取下面資訊中根分割區的佔有率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
執行命令:
[root@localhost tmp]# df -h | grep "dev/sda3" | awk '{print $5}' | cut -d "%" -f 1 12
到此這篇關於Shell AWK程式設計的基本介紹和使用詳解的文章就介紹到這了,更多相關Shell AWK使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45