gpt4 book ai didi

BASH 输出列格式

转载 作者:bug小助手 更新时间:2023-10-28 10:50:45 25 4
gpt4 key购买 nike

第一次发帖。 Hello World 。处理我的第一个脚本,它只是检查我的网站列表是否在线,然后返回 HTTP 代码以及将其返回到我桌面上的另一个文件所花费的时间。

-- 这个脚本将在 MAC OSX 上运行 --

我想修改我的脚本,以便将其输出格式化为 3 个整齐的列。

目前

#!/bin/bash
file="/Users/USER12/Desktop/url-list.txt"
printf "" > /Users/USER12/Desktop/url-results.txt
while read line
do
printf "$line" >> /Users/USER12/Desktop/url-results.txt
printf "\t\t\t\t" >> /Users/USER12/Desktop/url-results.txt
curl -o /dev/null --silent --head --write-out '%{http_code} %{time_total}' "$line" >> /Users/USER12/Desktop/url-results.txt
printf "\n" >> /Users/USER12/Desktop/url-results.txt
done <"$file"

以下列格式输出

google.com              200 0.389
facebook.com 200 0.511
abnormallyLongDomain.com 200 0.786

但我想格式化成整齐对齐的列以便于阅读

DOMAIN_NAME                 HTTP_CODE   RESPONSE_TIME
google.com 200 0.389
facebook.com 200 0.511
abnormallyLongDomain.com 200 0.486

感谢大家的帮助!!

最佳答案

column 非常好。但是,您已经在使用 printf ,它可以让您更好地控制输出格式。使用 printf 的特性还可以让代码在一定程度上得到简化:

#!/bin/bash
file="/Users/USER12/Desktop/url-list.txt"
log="/Users/USER12/Desktop/url-results.txt"
fmt="%-25s%-12s%-12s\n"
printf "$fmt" DOMAIN_NAME HTTP_CODE RESPONSE_TIME > "$log"
while read line
do
read code time < <(curl -o /dev/null --silent --head --write-out '%{http_code} %{time_total}' "$line")
printf "$fmt" "$line" "$code" "$time" >> "$log"
done <"$file"

使用上面定义的格式,输出如下:

DOMAIN_NAME              HTTP_CODE   RESPONSE_TIME
google.com 301 0.305
facebook.com 301 0.415
abnormallyLongDomain.com 000 0.000

您可以通过更改脚本中的 fmt 变量来微调输出格式,例如间距或对齐方式。

进一步改进

上面的代码在每个循环中打开和关闭日志文件。正如 Charles Duffy 建议的那样,这可以避免,只需在第一个 printf 语句之前使用 execstdout 重定向到日志文件:

#!/bin/bash
file="/Users/USER12/Desktop/url-list.txt"
exec >"/Users/USER12/Desktop/url-results.txt"
fmt="%-25s%-12s%-12s\n"
printf "$fmt" DOMAIN_NAME HTTP_CODE RESPONSE_TIME
while read line
do
read code time < <(curl -o /dev/null --silent --head --write-out '%{http_code} %{time_total}' "$line")
printf "$fmt" "$line" "$code" "$time"
done <"$file"

或者,正如 Chepner 所建议的,可以对打印语句进行分组:

#!/bin/bash
file="/Users/USER12/Desktop/url-list.txt"
fmt="%-25s%-12s%-12s\n"
{
printf "$fmt" DOMAIN_NAME HTTP_CODE RESPONSE_TIME
while read line
do
read code time < <(curl -o /dev/null --silent --head --write-out '%{http_code} %{time_total}' "$line")
printf "$fmt" "$line" "$code" "$time"
done <"$file"
} >"/Users/USER12/Desktop/url-results.txt"

分组的一个好处是,分组后stdout会自动恢复到正常值。

关于BASH 输出列格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com