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

2023-10-29

目录

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. 格式化参数

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

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

示例:printf  '%s'  'abc'

                                               

1.2. 转义符参数

\":输出一个双引号
\\:输出一个反斜杠
%%:输出一个百分号

\n:输出换行
\t:水平制表符
\v:垂直制表符
\r:输出回车
\f:换页

\a:发出警报
\b:退格
\e:删除右边一个字符

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

示例:printf  '\t abc'

                                               

2. 常见用法

2.1. 输出字符串

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

printf "Hello, World"

                                               

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

printf "Hello, World\n"
printf "Hello, \nWorld\n"

                                               

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

printf "a\tb\tc\n"

                                               

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

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

                                               

2.2. 格式化输出

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

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

                                               

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

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

                                               

3、使用变量传入参数

方法一

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

方法二

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

方法三

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

                                               

2.3. 设置格式对齐

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

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

                                               

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

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

                                               

2.4. 控制输出宽度

1、设置最小宽度

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

                                               

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

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

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

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

                                               

2.5. 替换补全字符

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

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

                                               

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

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

                                               

3. 设置颜色

3.1. 参数选项

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

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

                                               

设置文本颜色(30~37)

黑色:\033[30m
红色:\033[31m
绿色:\033[32m
黄色:\033[33m
蓝色:\033[34m
洋红:\033[35m
青色:\033[36m
白色:\033[37m

                                               

设置背景色(40~47)

黑色背景:\033[40m
红色背景:\033[41m
绿色背景:\033[42m
黄色背景:\033[43m
蓝色背景:\033[44m
洋红背景:\033[45m
青色背景:\033[46m
白色背景:\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
printf "\033[30m 文本黑色 \033[0m \n"
printf "\033[31m 文本红色 \033[0m \n"
printf "\033[32m 文本绿色 \033[0m \n"
printf "\033[33m 文本黄色 \033[0m \n"
printf "\033[34m 文本蓝色 \033[0m \n"
printf "\033[35m 文本洋红色 \033[0m \n"
printf "\033[36m 文本青色 \033[0m \n"
printf "\033[37m 文本白色 \033[0m \n"

                                               

3.4. 设置背景颜色

  • 背景颜色:40 ~ 47
printf "\033[40m 背景黑色 \033[0m \n"
printf "\033[41m 背景红色 \033[0m \n"
printf "\033[42m 背景绿色 \033[0m \n"
printf "\033[43m 背景黄色 \033[0m \n"
printf "\033[44m 背景蓝色 \033[0m \n"
printf "\033[45m 背景洋红色 \033[0m \n"
printf "\033[46m 背景青色 \033[0m \n"
printf "\033[47m 背景白色 \033[0m \n"

                                               

4. 其他方法

4.1. 制作表格

1、通过宽度设置来制作

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

                                               

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

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

                                               

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

# 开始前打印横线
perl -E "say '-' x 67"

function Output(){
    # 输出字符串,设置每个表格宽度为20
    printf "|%-20s |%-20s |%-20s |\n" `echo $1 |xargs -n 1`
    # 结束后打印横线
    perl -E "say '-' x 67"
        }

# 向函数传入需要打印的字符串
Output "id name avg"
Output "1 xiao_wang 18"
Output "2 xiao_zhang 20"
Output "3 xiao_li 16"

                                               

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

# 将需要传入的字符串全部写入一个变量
var="
id name avg
1 xiao_wang 18
2 xiao_zhang 20
3 xiao_li 16"

# 封装一个打印表格的方法
perl -E "say '-' x 67"
function Output(){
        printf "|%-20s |%-20s |%-20s |\n" `echo $1 |xargs -n 1`
        perl -E "say '-' x 67"
        }

# 指定循环的分隔符为换行
OLD_IFS=$IFS; IFS=$'\n'
# 遍历遍历中的字符串
for i in ${var};do
    # 传入不为空的字符串到Output方法
    [ -n "${i}" ] && Output ${i}
done
# 还原分隔符
IFS=$OLD_IFS

                                               

4.2. 获取硬件信息

#!/bin/bash

# CPU
cpu_name="$(grep '^model name' /proc/cpuinfo |awk -F ': ' 'NR==1{print $2}')"
cpu_proc="$(grep 'processor' /proc/cpuinfo |wc -l)"

# Memory
mem_total="$(free -h |awk '$1=="Mem:"{print $2}')"
mem_free="$(free -h |awk '$1=="Mem:"{print $4}')"
swap_total="$(free -h |awk '$1=="Swap:"{print $2}')"
swap_free="$(free -h |awk '$1=="Swap:"{print $4}')"

# Disk
dev_name="$(ls /sys/block/ |grep -vE "loop|dm|sr")"

# Network
net_name="$(ip route get 8.8.8.8 |awk -F 'dev' 'NR==1{print $2}' |awk '{print $1}')"
host="$(ip route get 8.8.8.8 |awk -F 'src' 'NR==1{print $2}' |awk '{print $1}')"
bandwidth="$(ethtool ens33 |awk '$1=="Speed:"{print $2}')"

# 封装一个输出表格的方法
echo -e "硬件信息如下:"
perl -E "say '——' x 37"
Output(){
    printf "|%-20s |%-50s|\n" "$1" "$2"
    perl -E "say '——' x 37"
    }

# 向Output传入硬件信息
Output "CPU model name" "${cpu_name}"
Output "CPU processor" "${cpu_proc}"
Output "Memory (free/total)" "${mem_free} / ${mem_total}"
Output "Swap (free/total)" "${swap_free} / ${swap_total}"
for d in ${dev_name};do
    disk_size="$(lsblk -o size -d /dev/${d} |awk 'NR==2{print $1}')"
    if [[ "$d" =~ "nvme" ]];then
        Output "Disk (${d})" "NVME (${disk_size})"
    else
        if [ `cat /sys/block/${d}/queue/rotational` -eq 1 ];then
            Output "Disk (${d})" "HDD (${disk_size})"
        else
            Output "Disk (${d})" "SSD (${disk_size})"
        fi
    fi
done
Output "Network" "${host} (${net_name}, ${bandwidth})"

                                               

4.3. 实时输出百分比

#!/bin/bash

# 需要运行某个任务的次数
total_iterations=100000

for i in $(seq 1 ${total_iterations}); do
    # 计算百分比(取整)
    percentage=$((i * 100 / total_iterations))

    # 输出百分比并保持在同一行
    printf "Progress: %d%%\r" $percentage

    # 运行任务
    echo "$i" >> ./tmp.txt
done

# 输出最终完成状态
printf "Progress: 100%%\n"

                 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux命令_printf & 格式化输出信息 的相关文章

  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • shell脚本中的\r字符

    我在尝试执行 shell 脚本时收到以下错误 r command not found line 2 请提出同样的解决方案 以下是脚本中使用的初始行 bin sh if lt 1 then echo ERROR Environment arg
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • if [ -z "${FILE_LIST}" ] 中的 -z 是什么

    遇到了这个 什么是 z在 shell 脚本中if z FILE LIST 是相同的test And man test gives z STRING the length of STRING is zero 注意 在某些平台上 是一个符号链接
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • Pyaudio 安装错误 - “命令‘gcc’失败,退出状态 1”

    我正在运行 Ubuntu 11 04 Python 2 7 1 并想安装 Pyaudio 于是我跑了 sudo easy install pyaudio 在终端中 进程退出并显示以下错误消息 Searching for pyaudio Re
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少

随机推荐

  • 10分钟上手Azure Blob Storage

    文章目录 Azure Blob Storage快速上手 背景 什么是Azure Blob Storage Blob Storage的应用场景 环境搭建 安装 运行 修改Blob Storage中的数据 基本操作 使用C 修改文件属性 遇到问
  • 平摊分析典型例题及解答

    Exercise 1 5 对某个数据结构执行大小为 n 的一个操作序列 若 i 为 2 的整数幂 则第 i 个操作的代价 为 i 否则为 1 请利用会计方法分析每次操作的平摊代价 Exercise 2 15 Bill 提出了一种叫做翻转堆栈
  • SpringClud Sleuth + Zipkin + Kafka实现分布式链路追踪

    SpringClud Sleuth Zipkin Kafka实现分布式链路追踪 使用步骤 使用步骤 1 导入 pom 依赖
  • 关于Spring Cloud Gateway 网关限流

    本文将使用以下两种方式实现网关的限流 使用 Spring Cloud Gateway 的 RequestRateLimiter 过滤器工厂基于 Redis 的限流 使用 Sentinel 结合 Spring Cloud Gateway 来实
  • vue动态组件component详解

    附上代码
  • 演唱会门票抢不到?不要慌,教你用python实现自动化抢票

    前言 之前有小伙伴留言说女朋友快生日了 喜欢某某某但是手动买票根本就是买不到 又不想当大冤种从黄牛手里加钱 于是乎在疯狂星期四的晚上遭到 贿赂 的我连夜搞定了 一丶安装环境和配置文件 要用python实现 下载和安装python自然是不用说
  • P1016 旅行家的预算【模拟+贪心】【详解】

    题目链接 思路 这道题是一道很明显的模拟题 但这道题也需要自己的理解 我自己写了些样例 然后找到了其中的模拟 我们假设从一个点出发 对于它的下一个点我们有很多选择 期间定义一个len用以记录满油 单次最远 到达距离 我们造访这条路上的所有点
  • MYSQL数据库(六)用户、权限管理和DCL语句

    成功不易 加倍努力 1 MySQL用户管理 2 权限管理和DCL语句 3 MySQL的图形化的远程管理工具 1 MySQL用户管理 元数据数据库 mysql 系统授权表 USERNAME HOST HOST 主机名 user1 web1 m
  • 区块链到底是怎么运行的

    为了方便你理解 这一篇文章我将以比特币为例来进行讲解 因为比特币算是区块链应用中最简单 最容易理解的一个案例了 中心化记账的问题 首先 举一个关于中心化记账的经典例子 银行转账 假设小明给小红转200块 银行收到了转账请求 将小明银行账户里
  • 区块链hyperledger fabric架构详解

    hyperledger fabric是区块链中联盟链的优秀实现 主要代码由IBM Intel 各大银行等贡献 目前v1 1版的kafka共识方式可达到1000 s次的吞吐量 本文中我们依次讨论 区块链的共通特性 fabric核心概念 fab
  • vue全局一个格式化时间-format

    vue圈定定义一个format 用来格式化时间 Date prototype format function fmt const o M this getMonth 1 月份 d this getDate 日 h this getHours
  • Sudo: unable to initialize policy plugin 解决方法

    在centos7下 使用sudo 命令对www用户生成ssh秘钥 结果报错如下 Sudo parse error in etc sudoers near line 125 Sudo no valid sudoers sources foun
  • OS - 操作系统实战 - 学习/实践

    1 应用场景 主要用于学习 设计和编写操作系统 同时帮助更加好低理解操作系统 研究Linux系统 提供编程能力 2 学习 操作 1 文档阅读 操作系统实战45讲 操作系统 Linux 计算机基础 底层 内核 后端开发 iOS 彭东 C语言
  • c++中string的substr函数

    在 C 中 substr 函数用于提取字符串的子串 它有两种常用的用法 1 substr pos len 提取从位置 pos 开始的长度为 len 的子串 pos 指定提取子串的起始位置 位置从 0 开始 len 指定提取子串的长度 如果不
  • 2019年3月web前端最新面试题

    最近在找工作 面试了好多家公司 结果都不怎么理想 要么公司环境氛围不行 要么工资达不到理想的薪资 大部分公司对程序员的面试流程几乎都一样 来了先填一份登记表 写一套面试题 然后技术面 人事面 至于有的大牛说 四面web前端 拿到10K 的工
  • js 搜索关键字高亮

    主要是通过replace方法实现的 实现代码
  • SSTI 学习笔记

    PHP SSTI Twig 学习文章 进入环境 左上角有flag hint 都检查看看 flag页面显示ip hint页面源代码有提示 考虑XFF头或者referer头 测试一下 注 这里不用加上 出来了 python flask ssti
  • 30岁之后想转行,可行吗?这20条建议让你少走弯路!

    都说三十而立 可眼看着到了意气风发的年龄 却突然意识到自己仍一事无成 甚至连养活自己都是问题 30多岁 大多数人还要开始买房 买车 结婚生子 养家糊口 于是各种压力逼迫之下 就想到了转行 期望可以通过转行实现 财务自由 不过 俗话说 隔行如
  • 函数strlen的使用

    函数strlen是C语言的提供的函数 它包含在 include
  • 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 设置文