8.正规表示法本章同步视频:https://edu.51cto.com/sd/e4874

8.4 文件的格式化与相关处理

8.4.1 printf - format and print data

1.语法

[root@localhost tmp]#printf [format] [文本1] [文本2] ..

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

%ni   那个 n 是数字, i 代表 integer ,亦即多少整数字数;

%N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),有n位小数字数。

(1)常用格式符

%s

字符串

%f

浮点格式

%c

ASCII字符,即显示对应参数的第一个字符

%d,%i

十进制整数

%o

八进制值

%u

不带正负号的十进制值

%x

十六进制值(a-f)

%X

十六进制值(A-F)

%%

表示%本身

2)常用转义字符

\a

警告字符,通常为ASCII的BEL字符

\b

后退

\f

换页

\n

换行

\r

回车

\t

水平制表符

\v

垂直制表符

\\

表示\本身

2.用法

[root@localhost tmp]# printf "%d\n" 123    

123     #按整数输出123

[root@localhost tmp]# printf "1234567890\n%5d\n" 123

1234567890      #按整数输出123,占5列,右对齐,左边补2个空格

    123

[root@localhost tmp]# printf "1234567890\n%-5da\n" 123

1234567890     #按整数输出123,占5列,左对齐,右边补2个空格

123    a

[root@localhost tmp]# printf "%s\n" 1 2    

1     #按字符串输出1和2

2     #一个控制符可以输出多个数据

[root@localhost tmp]# printf "%d\n" 1 2

1     #按整数输出1和2

2

[root@localhost tmp]# printf "%f\n" 1 2

1.000000     #按浮点数输出1和2

2.000000

[root@localhost tmp]# printf "%8.2f\n" 1 2

    1.00    #按字符串输出1和2

    2.00    #总占位8列,含2位小数

[root@localhost tmp]# printf "%o\n" 12

14        #八进制输出12

[root@localhost tmp]# printf "%x\n" 12

c        #十六进制输出12

[root@localhost tmp]# cat test       #测试文件

name     Chinese   English   Math    Average

DmTsai        80        60     92      77.33

VBird         75        55     80      70.00

Ken           60        90     70      73.33

[root@localhost tmp]# printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat test)

name  Chinese  English  Math  Average  #输出字段用tab分隔

DmTsai  80  60  92  77.33  #有点乱

VBird      75  55  80  70.00     

Ken  60  90  70  73.33     

[root@localhost tmp]# printf '%10s %5i %5i %5i %8.2f \n' $(cat test)

bash: printf: Chinese: invalid number       #姓名占10列

bash: printf: English: invalid number        #成绩占5列

bash: printf: Math: invalid number            #平均成绩占8列,2为小数

bash: printf: Average: invalid number       #目的是为了输出能对齐

      name     0     0     0     0.00                  #但,第一行解析失败

    DmTsai    80    60    92    77.33             #成功操作看下一个例子

     VBird    75    55    80    70.00

       Ken    60    90    70    73.33

[root@localhost tmp]# printf '%10s %5i %5i %5i %8.2f \n' $(cat test|grep -v name)

    DmTsai    80    60    92    77.33       #不显示含有name的那一行,即第一行

     VBird    75    55    80    70.00

       Ken    60    90    70    73.33