2011-11-24 346 views
2

我試圖用shell腳本以表格格式打印一組值。該表有n行和4列。我試了下面這段代碼。Shell腳本以表格格式打印

btfield=`grep -i -r ^"diag.* <string>" *.txt |awk '{print $5}'|cut -d+ -f 1 |sort -u` 
ipaddr='' 
i=0 
format="%10s\t%10s\t%10s \n" 
echo "| Function " "  |   IP   |" " occurences  |" 
for a in $btfield 
do 
    b=`grep -i -r ^"diag.* <string>" *.txt |grep -i $a |cut -d: -f 1|cut -d_ -f 2|cut -d't' -f 1` 
    noOcc=`grep -i -r ^"diag.* backtrace" *.txt |grep -i $a|wc -l` 
    #echo $b 
    ipaddr[i]=${b} 
    printf "$format" $a ${ipaddr[i]} $noOcc 
    i=$((i+1)) 
    #echo $i 
done 

上面這段代碼根據格式說明符從各種文件中找到不同的字段並進行打印。

但我所看到的是輸出的錯位形式。有什麼方法可以打印表格格式的值?列寬是固定的,如果單元格中的值超過寬度,它必須自行包裝。

Sample output: 

|  reason   |  STB IP   |  occurences  | 
printf  142.25.1.100. 142.25.1.100. 
142.25.1.102. 142.25.1.105. 192.168.1.100. 
192.168.1.100. 192.168.1.100. 192.168.1.100. 
192.168.1.106.   9     
class_consol  142.25.1.105. 192.168.1.103. 
     2         
getChar 182.168.1.102.   1 
    maindat  142.25.1.103.   1 
_XN52getappdatafrom3EZN2232_iPjj  142.25.1.103. 142.25.1.103. 
182.168.1.106.  

回答

4

而不是使用回聲,請使用printf命令。

你可以使用%S字符串或%d整數,這樣的事情,

printf " %s %d", $string1 $int1 

你可以根據你的屏幕空間,通過使用%20s使用20個字符的字符串,%12d爲整數。

格式控制選項也可用:

\ n:換行

\ t:製表鍵(水平)

符\ v:標籤(垂直)

我希望這有助於

2

只要在printf中明確指出逗號是不需要的。

所有要打印的內容都應該用雙引號引起來,在引用這些引號之後,你必須提到在雙引號內使用的變量。

例如:

name=barack 
age=52 
printf "My name is %s \t age is %s \n" $name $age 

輸出:

my name is barack  age is 52 

確切問題的答案是(假設爲可變值被正確計算):

印刷標題:

printf "|\tFunction\t|\tIP\t|\toccurences\t|\n" 

印刷值:當然

printf "|\t%s\t|\t%s\t|\t%s\t|\n" $a ${ipaddr[i]} $noOcc 

數翼片(\ t)的取決於數據的長度。