column very nice. You, however, already use printf , which gives you great control over the output format. Using printf functions also simplifies the code:
#!/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"
With the above format, the output is as follows:
DOMAIN_NAME HTTP_CODE RESPONSE_TIME google.com 301 0.305 facebook.com 301 0.415 abnormallyLongDomain.com 000 0.000
You can fine-tune the output format, such as distance or alignment, by changing the fmt variable in the script.
Further refinement
The above code opens and closes the log file with each cycle. This can be avoided, as suggested by Charles Duffy, simply by using exec to redirect stdout to the log file before the first printf statement:
#!/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"
Alternatively, as Hepner suggests, print statements can be grouped:
#!/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"
The advantage of grouping is that after the group, stdout is automatically restored to its normal value.
source share