AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 780231
Accepted
vrms
vrms
Asked: 2024-07-16 16:15:20 +0800 CST2024-07-16 16:15:20 +0800 CST 2024-07-16 16:15:20 +0800 CST

由几个“#”字符构成的命令输出

  • 772

我希望受到

# #####################################################
# ### PostgreSQL 16.3 #################################
# #####################################################

登录到 postgres 服务器。

所以我补充

echo "# #####################################################"
psql -qAtc "SELECT version()" | awk {'print $1, $2'}
echo "# #####################################################"

到~/.bashrc。

我现在可能需要某种类型的,echo但$(psql -qAtc "SELECT version()" | awk {'print $1, $2'})不知道如何添加前导/尾随#。

有人能给我指出正确的方向吗?

bash
  • 4 4 个回答
  • 336 Views

4 个回答

  • Voted
  1. ilkkachu
    2024-07-16T20:39:46+08:002024-07-16T20:39:46+08:00

    如果要使线条长度相同,棘手的部分是#动态打印正确数量的符号。您可以执行以下操作(在 Bash 或 zsh 中):

    #!/bin/bash
    fill() {
        local width="$1" char="$2"
        printf -v str "%${width}s" ""
        printf "%s" "${str// /$char}"
    }
    fill 20 "#"  # prints 20 # signs
    

    这会滥用 printf 格式说明符在给定宽度的字段中打印空字符串,从而产生那么多空格。(即%20s填充到 20 个字符。)然后用我们实际想要的字符替换空格。

    然后整个盒子可以打印如下内容:

    width=50
    verstr=$(psql -qAtc "SELECT version()" | awk {'print $1, $2'})
    
    printf "# %s\n" "$(fill $width "#")"
    printf "# ### %s %s\n" "$verstr" "$(fill $(( width - ${#verstr} - 5)) "#")"
    printf "# %s\n" "$(fill $width "#")"
    

    其中width是符号数#(第一个符号之后),并且$(( width - ${#verstr} - 5))只计算在版本字符串、第一个符号###和两边的空格之后还剩下多少个符号需要打印。但是,如果结果为负数,则会产生奇怪的效果。:)

    和

    width=50
    verstr="PostgreSQL 16.3"
    

    输出是

    # ##################################################
    # ### PostgreSQL 16.3 ##############################
    # ##################################################
    

    (printf -v var并且${var/pattern/replacement}不是标准 shell 功能。第一个可以用命令替换来替换,但第二个可能需要分叉到tr。)


    当然,如果你不想那么花哨,那就简单多了,例如:

    verstr=$(psql -qAtc "SELECT version()" | awk {'print $1, $2'})
    printf "# #####################################################\n"
    printf "# ### %s\n" "$verstr"
    printf "# #####################################################\n"
    

    会打印类似

    # #####################################################
    # ### PostgreSQL 16.3
    # #####################################################
    

    并且可以在任何类 POSIX shell 中工作。


    或者,如评论中所述,您可以先打印整行井号,然后按回车键返回到开头,然后改写该行,无需计算字符数。在终端上,结果与仅打印所需数量的字符相同,但当然,如果您使用 egless或许多其他程序查看输出,就会看到差异。

    verstr=$(psql -qAtc "SELECT version()" | awk {'print $1, $2'})
    printf "# #####################################################\n"
    printf "# #####################################################\r" # \r not \n
    printf "# ### %s \n" "$verstr"
    printf "# #####################################################\n"
    

    看起来就像:

    # #####################################################
    # ### PostgreSQL 16.3 #################################
    # #####################################################
    
    • 4
  2. hc_dev
    2024-07-17T04:19:47+08:002024-07-17T04:19:47+08:00

    您还可以使用ASCII-art工具,例如 install boxes。有关详细信息,另请参阅相关问题中的长答案。

    改编示例:

    psql -qAtc "SELECT version()" | awk {'print $1, $2'} | boxes -d shell -p a1
    

    应打印如下:

    ###################
    #                 #
    # PostgreSQL 16.3 #
    #                 #
    ###################
    

    也可以看看:

    • Boxes - 在 Linux 终端中绘制 ASCII 艺术框和形状
    • 在 Linux 终端中使用 ASCII 艺术的 10 个工具

    简化版(仅限版本)

    由于psql已经指明了 DBMS 名称“PostgreSQL”,因此服务器版本在打印输出中可能就足够了。咨询 StackOverflow,linux - 我运行的是哪个版本的 PostgreSQL?,仅SHOW server_version;返回版本号,这使得使用 进行解析awk变得过时。这将一行代码简化为

    psql -qAtc "SHOW server_version;" | boxes -d shell -p a1
    

    应打印:

    ########
    #      #
    # 16.3 #
    #      #
    ########
    
    • 2
  3. Best Answer
    kestrel
    2024-07-16T17:09:09+08:002024-07-16T17:09:09+08:00

    您应该能够使用$()和引号的组合来输出该命令的结果,如下所示:

    echo "### $(psql -qAtc "SELECT version()" | awk {'print $1, $2'}) #############"
    

    这应该输出哈希值但仍评估并打印该$()部分作为命令。

    • 1
  4. Martin Kealey
    2024-07-17T06:48:23+08:002024-07-17T06:48:23+08:00

    有些事情实际上不值得编写代码,这就是其中一种情况。

    我希望 PostGreSQL 的版本很少更改,因此每次登录时不需要进行计算。

    已经有一种机制可以向每个登录的人显示静态文件的内容,而无需进行.bashrc任何更改:只需将您想要的消息写入/etc/issue.net(和/etc/issue)并让sshd(和其他登录方法)负责将其显示给用户。

    如果您只希望将消息显示给自己而不显示给其他用户,请添加cat ~/.issue或.bash_profile(.profile无论存在的哪个)而不是.bashrc(在每个交互式 shell 中运行,而不仅仅是在您登录时运行)。

    然后,您只需要在 postgres 版本发生变化时安排/etc/issue*或更新;就我个人而言,我只会手动编辑它,但是......~/.issue

    如果您确实希望它自动化,请考虑添加一个update-alternatives钩子,或运行每周的 cron 作业。(在后一种情况下,您需要有一个单独的脚本来执行更新;尝试将整个命令塞进一行crontab需要额外的操作\,而这些操作很难正确完成。

    #!/bin/bash
    # If the line above does not work on your system then change it to the actual path to your installed Bash; do NOT use "env". Once it works please delete this line.
    
    IFS= read -r text < <(
      psql -qAtc 'select version();' 
    )
    text="###  $text  ###"
    blank="###  ${text//?/ }  ###"
    line=${text//?/#}
    msg="\
    $Line
    $blank
    $text
    $blank
    $line"
    
    printf > "$HOME"/.issue '%s\n' "$msg"
    printf > /etc/issue '%s\n' "$msg"
    
    
    
    • 1

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve