当前位置:   article > 正文

Linux命令_printf & 格式化输出信息_linux printf

linux printf

目录

1. 语法

1.1. 格式化参数

1.2. 转义符参数

2. 常见用法

2.1. 输出字符串

2.2. 格式化输出

2.3. 设置格式对齐

2.4. 控制输出宽度

2.5. 替换补全字符

3. 设置颜色

3.1. 参数选项

3.2. 基本用法

3.3. 设置文本颜色

3.4. 设置背景颜色

4. 其他方法

4.1. 制作表格

4.2. 获取硬件信息

4.3. 实时输出百分比


1. 语法

1.1. 格式化参数

  1. %s: 指定输出字符串。
  2. %d、%i: 指定输出十进制整数。
  3. %o: 指定输出八进制数。
  4. %x、%X: 指定输出十六进制数。
  5. %f、%F: 指定输出浮点数。
  6. %e、%E: 以科学计数法输出浮点数。
  7. %c: 指定输出字符。
  8. %%: 输出一个百分号。

用法:printf  '<参数>'  '<字符串>'

示例:printf  '%s'  'abc'

                                               

1.2. 转义符参数

  1. \":输出一个双引号
  2. \\:输出一个反斜杠
  3. %%:输出一个百分号
  4. \n:输出换行
  5. \t:水平制表符
  6. \v:垂直制表符
  7. \r:输出回车
  8. \f:换页
  9. \a:发出警报
  10. \b:退格
  11. \e:删除右边一个字符

用法:printf  '<参数> <字符串>'

示例:printf  '\t abc'

                                               

2. 常见用法

2.1. 输出字符串

1、直接输出字符串(不会主动换行)

printf "Hello, World"

                                               

2、输出字符串后面加入换行符(换行符加入哪里,哪里开始换行)

  1. printf "Hello, World\n"
  2. printf "Hello, \nWorld\n"

                                               

3、于上述同理,制表符也是一样

printf "a\tb\tc\n"

                                               

4、输出一些不想转义的字符

  1. printf "\" \n" # 输出双引号
  2. printf "\\ \n" # 输出反斜杠
  3. printf "%% \n" # 输出百分号

                                               

2.2. 格式化输出

1、输出字符串、整数、浮点数、科学计数法浮点数

  1. printf "%s \n" "abc" # 输出字符串
  2. printf "%d \n" "100" # 输出整数
  3. printf "%.2f \n" "3.1415926" # 输出浮点数,精度为2
  4. printf "%e \n" "3.1415926" # 输出浮点数科学计算法

                                               

2、输出多个参数(按顺序输入)

printf "%s, %d, %.2f \n" "abc" "10" "3.1415926"

                                               

3、使用变量传入参数

方法一

  1. a="abc"
  2. b=10
  3. c=3.1415926
  4. printf "%s, %d, %.2f \n" "$a" "$b" "$c"

方法二

  1. [yt@localhost ~]$ read -r v1 v2 v3 v4 v5 <<< `seq 5`
  2. [yt@localhost ~]$ printf "var1=%s, var2=%s, var3=%s, var4=%s, var5=%s \n" "$v1" "$v2" "$v3" "$v4" "$v5"
  3. var1=1, var2=2, var3=3, var4=4, var5=5

方法三

  1. [yt@localhost ~]$ data="a,b,c,d,e"
  2. [yt@localhost ~]$ IFS=',' read -r v1 v2 v3 v4 v5 <<< "$data"
  3. [yt@localhost ~]$ printf "var1=%s, var2=%s, var3=%s, var4=%s, var5=%s \n" "$v1" "$v2" "$v3" "$v4" "$v5"
  4. var1=a, var2=b, var3=c, var4=d, var5=e

                                               

2.3. 设置格式对齐

1、左对齐、右对齐(区别就是左对齐使用符号 - )

  1. # 设置宽度为10
  2. printf "|%-10s| \n" "abc"
  3. printf "|%10s| \n" "abc"

                                               

2、居中对齐(计算字符串宽度与总宽度之间的空格,将这些空格补全)

  1. # 设置输出的字符串
  2. text="abc"
  3. # 指定总的宽度(需要大于字符串的长度)
  4. width=10
  5. # (总宽度 - 字符串宽度) / 2 = 空格长度,这个长度单独输出
  6. padding=$[(${width} - ${#text}) / 2]
  7. # 空格长度 + 字符串 + 空格长度
  8. printf "|%${padding}s%s%${padding}s| \n" "" "$text" ""

                                               

2.4. 控制输出宽度

1、设置最小宽度

  1. #设置宽度为5。默认右对齐,左对齐将5s改为-5s
  2. printf "|%5s| \n" "abc"

                                               

2、设置最大宽度(超过宽度自动截断)

  1. #设置最大宽度为5。只有左对齐
  2. printf "|%.5s| \n" "abc"

 超过指定宽度以省略号替代

printf "|%.5s...| \n" "abcdefg"

                                               

2.5. 替换补全字符

1、数字补全(指定位数,不够以0补全)

  1. # 指定5位整数,不足以0补全
  2. printf "%05d \n" "123"
  3. # 指定5位浮点数,小数点精确2位,不足以0补全(小数点也算1位)
  4. printf "%05.2f \n" "3.1415926"

                                               

2、字符串补全(printf 本身不支持字符串替换,利用 tr 命令)

  1. # 左对齐,将空格替换为 -
  2. printf "%-10s\n" "abc" |tr ' ' '-'
  3. # 右对齐,将空格替换为 -
  4. printf "%10s\n" "abc" |tr ' ' '-'

                                               

3. 设置颜色

3.1. 参数选项

设置属性(有些属性终端不支持或者需要单独配置)

  1. 重置所有文本属性:\033[0m
  2. 设置粗体:\033[1m
  3. 设置斜体:\033[3m
  4. 设置下划线:\033[4m
  5. 设置闪烁:\033[5m
  6. 设置反显(前景色与背景色互换):\033[7m
  7. 关闭闪烁和反显:\033[0m

                                               

设置文本颜色(30~37)

  1. 黑色:\033[30m
  2. 红色:\033[31m
  3. 绿色:\033[32m
  4. 黄色:\033[33m
  5. 蓝色:\033[34m
  6. 洋红:\033[35m
  7. 青色:\033[36m
  8. 白色:\033[37m

                                               

设置背景色(40~47)

  1. 黑色背景:\033[40m
  2. 红色背景:\033[41m
  3. 绿色背景:\033[42m
  4. 黄色背景:\033[43m
  5. 蓝色背景:\033[44m
  6. 洋红背景:\033[45m
  7. 青色背景:\033[46m
  8. 白色背景:\033[47m

                                               

3.2. 基本用法

1、基本用法

  • printf  "<属性> <字符串> <重置属性>"

                                               

2、设置文本颜色

printf "\033[31mHello World\033[0m \n"

                                               

3、设置背景颜色

printf "\033[41mHello World\033[0m \n"

                                               

3.3. 设置文本颜色

  • 文本颜色:30 ~ 37
  1. printf "\033[30m 文本黑色 \033[0m \n"
  2. printf "\033[31m 文本红色 \033[0m \n"
  3. printf "\033[32m 文本绿色 \033[0m \n"
  4. printf "\033[33m 文本黄色 \033[0m \n"
  5. printf "\033[34m 文本蓝色 \033[0m \n"
  6. printf "\033[35m 文本洋红色 \033[0m \n"
  7. printf "\033[36m 文本青色 \033[0m \n"
  8. printf "\033[37m 文本白色 \033[0m \n"

                                               

3.4. 设置背景颜色

  • 背景颜色:40 ~ 47
  1. printf "\033[40m 背景黑色 \033[0m \n"
  2. printf "\033[41m 背景红色 \033[0m \n"
  3. printf "\033[42m 背景绿色 \033[0m \n"
  4. printf "\033[43m 背景黄色 \033[0m \n"
  5. printf "\033[44m 背景蓝色 \033[0m \n"
  6. printf "\033[45m 背景洋红色 \033[0m \n"
  7. printf "\033[46m 背景青色 \033[0m \n"
  8. printf "\033[47m 背景白色 \033[0m \n"

                                               

4. 其他方法

4.1. 制作表格

1、通过宽度设置来制作

  1. printf "%-20s %-20s %-20s \n" "id" "name" "avg"
  2. printf "%-20s %-20s %-20s \n" "1" "xiao_wang" "18"
  3. printf "%-20s %-20s %-20s \n" "2" "xiao_zhang" "20"
  4. printf "%-20s %-20s %-20s \n" "3" "xiao_li" "16"

                                               

2、第1次优化代码,将执行方法写入函数

  1. Output(){
  2. printf "%-20s %-20s %-20s \n" `echo $1 |xargs -n 1`
  3. }
  4. Output "id name avg"
  5. Output "1 xiao_wang 18"
  6. Output "2 xiao_zhang 20"
  7. Output "3 xiao_li 16"

                                               

3、第2次优化代码,增加分割线(使用perl)

  1. # 开始前打印横线
  2. perl -E "say '-' x 67"
  3. function Output(){
  4. # 输出字符串,设置每个表格宽度为20
  5. printf "|%-20s |%-20s |%-20s |\n" `echo $1 |xargs -n 1`
  6. # 结束后打印横线
  7. perl -E "say '-' x 67"
  8. }
  9. # 向函数传入需要打印的字符串
  10. Output "id name avg"
  11. Output "1 xiao_wang 18"
  12. Output "2 xiao_zhang 20"
  13. Output "3 xiao_li 16"

                                               

4、第3次优化代码,将需要填入表格的字符串放入变量

  1. # 将需要传入的字符串全部写入一个变量
  2. var="
  3. id name avg
  4. 1 xiao_wang 18
  5. 2 xiao_zhang 20
  6. 3 xiao_li 16"
  7. # 封装一个打印表格的方法
  8. perl -E "say '-' x 67"
  9. function Output(){
  10. printf "|%-20s |%-20s |%-20s |\n" `echo $1 |xargs -n 1`
  11. perl -E "say '-' x 67"
  12. }
  13. # 指定循环的分隔符为换行
  14. OLD_IFS=$IFS; IFS=$'\n'
  15. # 遍历遍历中的字符串
  16. for i in ${var};do
  17. # 传入不为空的字符串到Output方法
  18. [ -n "${i}" ] && Output ${i}
  19. done
  20. # 还原分隔符
  21. IFS=$OLD_IFS

                                               

4.2. 获取硬件信息

  1. #!/bin/bash
  2. # CPU
  3. cpu_name="$(grep '^model name' /proc/cpuinfo |awk -F ': ' 'NR==1{print $2}')"
  4. cpu_proc="$(grep 'processor' /proc/cpuinfo |wc -l)"
  5. # Memory
  6. mem_total="$(free -h |awk '$1=="Mem:"{print $2}')"
  7. mem_free="$(free -h |awk '$1=="Mem:"{print $4}')"
  8. swap_total="$(free -h |awk '$1=="Swap:"{print $2}')"
  9. swap_free="$(free -h |awk '$1=="Swap:"{print $4}')"
  10. # Disk
  11. dev_name="$(ls /sys/block/ |grep -vE "loop|dm|sr")"
  12. # Network
  13. net_name="$(ip route get 8.8.8.8 |awk -F 'dev' 'NR==1{print $2}' |awk '{print $1}')"
  14. host="$(ip route get 8.8.8.8 |awk -F 'src' 'NR==1{print $2}' |awk '{print $1}')"
  15. bandwidth="$(ethtool ens33 |awk '$1=="Speed:"{print $2}')"
  16. # 封装一个输出表格的方法
  17. echo -e "硬件信息如下:"
  18. perl -E "say '——' x 37"
  19. Output(){
  20. printf "|%-20s |%-50s|\n" "$1" "$2"
  21. perl -E "say '——' x 37"
  22. }
  23. # 向Output传入硬件信息
  24. Output "CPU model name" "${cpu_name}"
  25. Output "CPU processor" "${cpu_proc}"
  26. Output "Memory (free/total)" "${mem_free} / ${mem_total}"
  27. Output "Swap (free/total)" "${swap_free} / ${swap_total}"
  28. for d in ${dev_name};do
  29. disk_size="$(lsblk -o size -d /dev/${d} |awk 'NR==2{print $1}')"
  30. if [[ "$d" =~ "nvme" ]];then
  31. Output "Disk (${d})" "NVME (${disk_size})"
  32. else
  33. if [ `cat /sys/block/${d}/queue/rotational` -eq 1 ];then
  34. Output "Disk (${d})" "HDD (${disk_size})"
  35. else
  36. Output "Disk (${d})" "SSD (${disk_size})"
  37. fi
  38. fi
  39. done
  40. Output "Network" "${host} (${net_name}, ${bandwidth})"

                                               

4.3. 实时输出百分比

  1. #!/bin/bash
  2. # 需要运行某个任务的次数
  3. total_iterations=100000
  4. for i in $(seq 1 ${total_iterations}); do
  5. # 计算百分比(取整)
  6. percentage=$((i * 100 / total_iterations))
  7. # 输出百分比并保持在同一行
  8. printf "Progress: %d%%\r" $percentage
  9. # 运行任务
  10. echo "$i" >> ./tmp.txt
  11. done
  12. # 输出最终完成状态
  13. printf "Progress: 100%%\n"

                 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号