簡體   English   中英

重擊:格式化多行函數結果並排

[英]Bash: Formatting multi-line function results alongside each other

我有三個函數可在我的服務器上摘要一個access.log文件。

hitsbyip() {
        cat $ACCESSLOG | awk '{ print $1 }' | uniq -c | sort -nk1 | uniq
}
hitsbyhour() {
        cat $ACCESSLOG | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":00"}' | sort -n | uniq -c
}
hitsbymin() {
        hr=$1
        grep "2015:${hr}" $ACCESSLOG | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":"$3}' | sort -nk1 -nk2 | uniq -c
}

單獨使用時,它們都可以正常工作。 所有這三個輸出2小數據列。

現在,我正在尋找創建另一個名為report printf ,該printf將簡單地使用printf及其格式化功能來打印帶有標題的3列數據,它們分別是我的第三個函數的結果。 像這樣:

report() {
       printf "%-30b %-30b %-30b\n" `hitsbyip` `hitsbyhour` `hitsbymin 10`
}

問題是格式不是我想要的; 它水平打印列,而不是並排打印。

任何幫助將不勝感激。

一旦使用paste將三個命令的輸出合並到單個流中, 可以逐行操作以格式化這些輸出。

while IFS=$'\t' read -r by_ip by_hour by_min; do
  printf '%-30b %-30b %-30b\n' "$by_ip" "$by_hour" "$by_min"
done < <(paste <(hitsbyip) <(hitsbyhour) <(hitsbymin 10))

注意事項:

  • <()語法是進程替換 它會生成一個文件名(在具有這種支持的平台上,通常為/dev/fd/##格式),當讀取時,它將產生給定命令的輸出。
  • paste需要一系列文件名,並將每個文件名的輸出與其他文件名放在一起。
  • 在讀取時設置IFS=$'\\t'可以確保我們以制表符分隔的值( paste創建的格式)讀取內容。 有關使用read詳細信息,請參見BashFAQ#1
  • printf的參數上加上引號可確保我們將每個read組裝的值作為單個值傳遞給printf ,而不是讓它們作為未引用的值進行字符串拆分和glob-expansion。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM