1. 程式人生 > 其它 >(轉)printf命令詳解

(轉)printf命令詳解

原文:https://www.cnblogs.com/machangwei-8/p/10354698.html

目錄


基礎命令學習目錄首頁

本文是Linux Shell系列教程的第(八)篇,更多shell教程請看:Linux Shell系列教程

在上一篇:Linux Shell系列教程之(七)Shell輸出這篇文章中,已經對Shell printf命令有了一個簡略的介紹,本篇給大家詳細介紹下Shell中的printf命令。

回到頂部

一、Shell printf命令語法

printf  format-string  [arguments...]

format-string為描述格式規格的字串,用來描述輸出的排列方式,最好為此字串加上引號。此字串包含按字面顯示的字元以及格式宣告,格式宣告時特殊的佔位符,用來描述如何顯示相應的引數。

arguments是與格式宣告相對應的引數列表,例如一系列的字串或變數值。

格式宣告由兩部分組成:百分比符號(%)和指示符。

最常用的格式指示符有兩個,%s用於字串,而%d用於十進位制整數。

格式字串中,一般字元會按字面顯示。轉義序列則像echo那樣,解釋後再輸出成相應的字元。格式宣告以%符號開頭,並以定義的字母集中的一個來結束,用來控制相應引數的輸出。

回到頂部

二、Shell printf命令轉義序列

Shell printf命令的轉義序列如下表所示

序列
\a 警告字元,通常為ASCII的BEL字元
\b 後退
\c 不顯示輸出結果中任何結尾的換行字元,而且任何留在引數裡的字元、任何接下來的引數以及任何留在格式字串中的字元都被忽略。
\f 換頁
\n 換行
\r 回車
\t 水平製表符
\v 垂直製表符
\\ 反斜槓字元
回到頂部

三、Shell printf命令格式指示符

Shell printf命令的格式指示符如下表所示

符號 說明
%c ASCII字元.顯示相對應引數的第一個字元
%d,%i 十進位制整數
%E 浮點格式([-d].precisionE [+-dd])
%e 浮點格式([-d].precisione [+-dd])
%g %e或%f轉換,看哪一個較短,則刪除結尾的零
%G %E或%f轉換,看哪一個較短,則刪除結尾的零
%s 字串
%u 不帶正負號的十進位制值
%x 不帶正負號的十六進位制.使用a至f表示10至15
%% 字面意義的%
%X 不帶正負號的十六進位制.使用A至F表示10至15
回到頂部

四、Shell printf命令精度格式指示符

Shell printf命令中精度格式指示符入下表所示

符號 含義
%d,%i,%o,%u,%x,%X 要列印的最小位數.當值的位數少於此數字時,會在前面補零.預設精度為1
%e,%E 要列印的最小位數.當值的位數少於此數字時,會在小數點後面補零,預設為精度為6.精度為0則表示不顯示小數點小數點右邊的位數
%f 小數點右邊的位數
%g,%G 有效位數的最大數目
%s

要列印字元的最大數目

使用舉例:

printf "%.5d\n" 15
輸出:00015

printf "%.10s\n" "a very long string"
輸出:a very lon

printf "%.2f\n" 123.4567
輸出:123.46
回到頂部

五、Shell printf命令一些識別符號

Shell printf命令的一些常用識別符號如下表所示

字元 說明
將欄位裡已格式化的值向左對齊
空格 在正值前置一個空格,在負值前置一個負號
+ 總是在數值之前放置一個正號或負號,即便是正值也是
# 下列形式選擇其一:%o有一個前置的o;
%x與%X分別前置的0x與0X;
%e,%E與%f總是在結果中有一個小數點;
%g與%G為沒有結尾的零。
0 以零填補輸出,而非空白.這僅發生在欄位寬度大於轉換後的情況

使用舉例:

$printf "%-20s%-15s%10.2f\n" "Shan" "zhang" 35       
輸出:Shan                zhang               35.00
%-20s表示一個左對齊、寬度為20個字元字串格式,不足20個字元,右側補充相應數量的空格符。
%-15s表示一個左對齊、寬度為15個字元字串格式。
%10.2f表示右對齊、10個字元長度的浮點數,其中一個是小數點,小數點後面保留兩位。

$printf "|%10s|\n" hello
輸出:|     hello|
%10s表示右對齊,寬度為10的字串,如不足是個字串,左側補充相應數量的空格數.

$printf "|%-10s|\n" hello
輸出:|hello     |
和案例二比較一下

$printf "%x %#x\n" 15 15
輸出:f 0xf
如果#標誌和%x,%X搭配使用,在輸出十六進位制數字時,前面回家0x或者0X字首.
使用標誌符的作用主要是為了動態的指定寬度和精度.
回到頂部

六、Shell printf命令的一些綜合示例

下面給大家總結了一些比較綜合的例子,希望能夠幫助大家學習Shell printf命令。

字串向左向右對齊:
$printf "|%-10s| |%10s|\n" hello world
輸出|hello     | |     world|

空白標誌:
$printf "|% d| |% d|\n" 15 -15                 
輸出:| 15| |-15|

+標誌:
$printf "|%+d| |%+d|\n" 15 -15  
輸出:|+15| |-15|

#標誌:
$printf "%x || %#X\n" 15 15
輸出:f || 0XF

0標誌:
$printf "%05d\n" 15
輸出:00015

對於轉換指示符%b、%c與%s而言,相對應的引數都應為字串。否則,他們會被解釋為C語言的數字常數(開頭的0位八進位制,以及開頭的0x與0X為十六進位制)。

更進一步說,如果引數的第一個字元為單引號或雙引號,則對應的數值是字串的第二個字元的ASCII值,比如:

命令:printf “%s is %d \n” a “‘a”

輸出:a is 97

當引數多於格式指示符時,格式指示符會根據需要再利用。

這種做法在引數列表長度未知時非常方便。

例如來自萬用字元表示式,如果留在格式字串裡剩下的指示符比引數多時,如果是數值轉換,則遺漏的值會被看做是零。

但如果是字串轉換,則被視為空字串(雖然可以這麼用,但比較好的方式應該是一一對應關係,即提供的引數數目和格式字串數目相同)。

如果printf無法進行格式的轉換,便返回一個非零的退出狀態。

好了,對於Shell printf命令的詳解就先進行到這裡,printf是一個非常強大的命令,希望大家平時能夠多多練習,爭取熟練掌握。

更多Shell教程請看:Linux Shell系列教程


本文由Linux技術達人【daxue】發表在:Linux大學
本文固定連結:Linux Shell系列教程之(八)Shell printf命令詳解
轉載請保留連結及出處!

作用:按照我們指定的格式輸出文字

語法格式

printf "FORMAT" , item1, item2, ...

printf的工作原理:
將printf後面的item作為引數逐個傳遞給"FORMAT"進行格式化後輸出

(1) 必須指定FORMAT,
(2) 不會自動換行,需要顯式給出換行控制符,\n
(3) FORMAT可以有多個,但是必須與後面的每個item指定格式符
    #printf "%s\n%s\n%s\n%4.2f\n%4.2f\n%4.2f\n" I love you 11 12.2 13.35
    一共6個item,所以就是必須有6個FORMAT。
    如果FORMAT數量少於item數量,則FORMAT的個數控制一次傳多少個item處理。
    比如:#printf "%7s %7s\n" I love you 11 12.2 13.35   2個FROMAT 6個item,一次傳2個處理
            I    love
            you      11
            12.2   13.35

格式符:與item一一對應
%c: 顯示字元的ASCII碼
%d, %i: 顯示十進位制整數
    #printf "%g\n" -1 10 100.15 123.14
    -1
    10
    100.15
    123.14

%e, %E:顯示科學計數法數值
    #printf "%e\n" A -1 10 100.15 123.14
    -bash: printf: A: invalid number
    0.000000e+00
    -1.000000e+00
    1.000000e+01
    1.001500e+02
    1.231400e+02

%f:顯示為浮點數
    #printf "%f\n" A -1 10 100.15 123.14
    -bash: printf: A: invalid number
    0.000000
    -1.000000
    10.000000
    100.150000
    123.140000

%g, %G:以科學計數法或浮點形式顯示數值
    printf "%g\n" A -1 10 100.15 123.14
    -bash: printf: A: invalid number
    0
    -1
    10
    100.15
    123.14

%s:顯示字串

%u:無符號整數
    #printf "%u\n" A -1 10 100.15 123.14
    -bash: printf: A: invalid number
    0
    18446744073709551615
    10
    -bash: printf: 100.15: invalid number
    0
    -bash: printf: 123.14: invalid number
    0

%o 不帶正負號的八進位制值
%u 不帶正負號的十進位制值
%x 不帶正負號的十六進位制值,使用a至f表示10至15
%X 不帶正負號的十六進位制值,使用A至F表示10至15
%%: 顯示%自身

 修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1f 四捨五入
    #printf "%-3.1f\n" 10 100.15 123.14
    10.0
    100.2
    123.1

-: 左對齊(預設右對齊) %-15s
+:顯示數值的正負符號 %+d
I love you 11 12.2 13.33
分別用echo 和 printf 按空格分隔換行輸出來看效果
#echo -e "I\n love\n you\n 11\n 12.2\n 13.33\n"
I
 love
 you
 11
 12.2
 13.33

#printf "%s\n" I love you 11 12.2 13.33
I
love
you
11
12.2
13.33
是不是再也不用頭疼\n換行的逐個設定了?

但是,再進行復雜一點的格式化輸出,echo就無法處理了
#printf "%s\n%s\n%s\n%4.2f\n%4.2f\n%4.2f\n" I love you 11 12.2 13.35
I
love
you
11.00
12.20
13.35

來一些例項:

為傳入的引數增加一對 [] 引數在[ ] 內

#cat mod|xargs printf "[ %s ]\n"
[ 周瑜-法師-烽火赤壁 ]
[ 不知火舞-法師-必殺·忍蜂 ]
[ 鎧-戰士-不滅魔軀 ]
#awk -F : '{printf "username:%15s | UID: %10d\n------------------------------------------\n",$1,$3}' /etc/passwd
awk -F: '{printf "%-8s %8s",$1 $2}' passwd.txt
username:          rtkit | UID:        498
------------------------------------------
username:          pulse | UID:        497
------------------------------------------
username:            gdm | UID:         42
------------------------------------------
username:           hunk | UID:        500
------------------------------------------
想怎麼樣式就輸出

修飾符對於數字的影響

#printf "%.3f\n" 123.456789 1234.56789
123.457
1234.568
當修飾符為%f時,控制小數點後的精度 .3 就是3位小數

#printf "%.6d\n" 123 1234
000123
001234
當修飾符為%d時,控制整數的位數,不足的在高位補0  .6 就是6位整數
技術連結