Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

這一節主要介紹三個命令工具

  • printf格式化輸出
  • awk管道命令使用
  • diff文件對比

格式化打印: printf

模本練習文件

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

練習測試文件

root@ubuntu:/tmp# printf '打印格式' 實際內容

printf選項與參數:

關於格式方面的幾個特殊樣式:

\a 警告聲音輸出

\b 倒退鍵(backspace)

\f 清除屏幕 (form feed)

\n 輸出新的一行

\r 亦即 Enter 按鍵

\t 水平的 [tab] 按鍵

\v 垂直的 [tab] 按鍵

\\xNN NN 為兩位數的數字,可以轉換數字成為字符。

關於 C 程序語言內,常見的變量格式

%ns 那個 n 是數字, s 代表 string ,亦即多少個字符;

%ni 那個 n 是數字, i 代表 integer ,亦即多少整數碼數;

%N.nf 那個 n 與 N 都是數字, f 代表 floating (浮點),如果有小數碼數,

假設我共要十個位數,但小數點有兩位,即為 %10.2f!

示例一,最模板練習文件只顯示姓名和成績,並且用tab分割

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

格式化輸出成績

由於 printf 並不是管線命令,因此我們得要通過類似上面的功能,將文件內容先提出來給 printf 作為後續的數據才行。 如上所示,我們將每個數據都以 [tab] 作為分隔,但是由於 Chinese 長度太長,導致 English 中間多了一個 [tab] 來將數據排列整齊!結果就看到數據對齊結果的差異了!

示例二,將上述文件,從第二行開始,分別以字符串,整數,小數點來顯示:

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

只輸出姓名成績

%10s 代表的是一個長度為 10 個字符的字串字段,%5i 代表的是長度為 5 個字符的數字字段,至於那個 %8.2f 則代表長度為 8 個字符的具有小數點的字段,其中小數點有兩個字符寬度。我們可以使用下面的說明來介紹 %8.2f 的意義:

字符寬度: 12345678 %8.2f意義:00000.00

awk:好用的數據處理工具

sed 常常作用於一整個行的處理, awk 則傾向於一行當中分成數個“字段”來處理。

root@ubuntu:/tmp# awk '條件類型1{動作1} 條件類型2{動作2} ...' filename

awk 後面接兩個單引號並加上大括號 {} 來設置想要對數據進行的處理動作。 awk 可以處理後續接的文件,也可以讀取來自前個指令的 standard output 。 但如前面說的, awk 主要是處理“每一行的字段內的數據”,而默認的“字段的分隔符號為 "空白鍵" 或 "[tab]鍵" ”!舉例來說,我們用 last 可以將登陸者的數據取出來,結果如下所示:

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

awk打印第一列和第三列

last -n 5 是取出5條登錄記錄

last -n 5 |awk '{print $1 "\t" $3}' 是取出帳號與登陸者的 IP ,且帳號與 IP 之間以 [tab] 隔開

$S(S>0)代表是第S列的意思,如果S=0的話,則$0代表的是一整行

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

輸出$0一整行

awk有三個特殊的變量 NF,NR,FS

NF每一行 ($0) 擁有的字段總數

NR目前 awk 所處理的是“第幾行”數據

FS目前的分隔字符,默認是空白鍵

示例:

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

NR與NF的使用

上圖可以看出NR代表行數,NF代表每行有幾列

awk 的邏輯運算字符

> 大於

< 小於

>= 大於或等於

<= 小於或等於

== 等於

!= 不等於

直接看示例

在 /etc/passwd 當中是以冒號 ":" 來作為字段的分隔, 該文件中第一字段為帳號,第三字段則是 UID。那假設我要查閱,第三欄小於 10 以下的數據,並且僅列出帳號與第三欄, 那麼可以這樣做:

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

FS使用方法

有趣吧!不過,怎麼第一行沒有正確的顯示出來呢?這是因為我們讀入第一行的時候,那些變量 $1, $2... 默認還是以空白鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行後才開始生效。那麼怎麼辦呢?我們可以預先設置 awk 的變量啊! 利用 BEGIN 這個關鍵字喔!這樣做:

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

BEGIN使用方法

awk計算功能:

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

awk計算功能

pay.txt是模板測試文件,用此文件來計算Total

root@ubuntu:/tmp# cat pay.txt | awk 'NR==1 {printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2 {printf "%10s %10i %10i %10i %10.2f\n", $1,$2,$3,$4,$2+$3+$4}'

當NR==1時,輸出第一行內容,加上"Total"列,當NR>=2時,計算2-4列的總值放置於Total下

printf是格式化輸出

diff 文件對比工具

root@ubuntu:~# diff [-bBi] from-file to-file

diff選項與參數:

from-file :一個文件名,作為原始比對文件的文件名;

to-file :一個文件名,作為目的比對文件的文件名;

注意,from-file 或 to-file 可以 - 取代,那個 - 代表“Standard input”之意。

-b :忽略一行當中,僅有多個空白的差異(例如 "about me" 與 "about me" 視為相同

-B :忽略空白行的差異。

-i :忽略大小寫的不同。

示例一:比對 passwd.old 與 passwd.new 的差異:

Linux之awk工具、printf如何格式化輸出?diff如何進行文件對比?

diff的用法

4d3 左邊第四行被刪除 (d) 掉了,基準是右邊的第三行

sys:x:3:3:sys:/dev:/usr/sbin/nologin 這邊列出左邊文件被刪除的那一行內容

6c5 左邊文件的第六行被取代 (c) 成右邊文件的第五行

games:x:5:60:games:/usr/games:/usr/sbin/nologin 左邊文件第六行內容

hahahahahahahaha 右邊文件第五行內容

還有兩個文件對比的指令 cmp,patch這裡不做詳細解釋,有興趣的朋友們可以自己試驗一把

以上就是本節的主要內容,有異議的地方評論區還望多多指教,如果感覺寫的還行,可以關注一波,點贊一波,多謝多謝!!!


分享到:


相關文章: