2012-11-12 109 views
1

當我在UNIX機器上嘗試 「cal | tail -6」,我得到 -UNIX cal命令特殊字符

   1 2 3 
4 5 6 7 8 9 10 
11 12 13 14 15 16 17 
18 19 20 21 22 23 24 
25 26 27 28 29 30 

但是當我嘗試 「cal | tail -6 | awk '{print $7}'」,我得到 -

10 
17 
24 

哪裏是3去?我的要求是基本都是平日即列2,3,4,5 & 6. 但我發現了,因爲的「cal

回答

0

由於每行的所有列都是三個字符寬,因此可以使用它來提取您希望的日期。例如,如果你只想在第7天在一列,你可以做到以下幾點:

cal | sed 's/^\(.\{18\}\).*$/\1/' 

此命令將刪除行中的第18個字符,這是的第6天的條目周。

要提取特定的日子,如第四天,你可以這樣做:

cal | sed 's/^.\{9\}\(.\{3\}\).*$/\1/' 

要刪除一週的最後一天的第一天,你可以這樣做:

cal | sed -e 's/^.\{3\}//' -e 's/^\(.\{15\}\).\{3\}$/\1/' 
+0

謝謝..對我有用..但是我注意到了最後一條命令中的一些內容,即使它不是sat/sun,它也會刪除該月份的最後一天。 –

+0

謝謝。編輯。 – djhaskin987

8

有你的第一行中只有3個空格分隔欄的奇怪行爲錯誤輸出。 cal完全按照修正的方式工作,您不理解awk如何工作。就awk而言,第一行中沒有第7列,因爲它會引起對空白分隔列而非固定寬度列的注意。

快速谷歌搜索發現,你可以使用

BEGIN { FIELDWIDTHS = "3 3 3 3 3 3 3" } 

在你awk腳本。

+0

任何解決有關此問題?我想坐在沙發/陽光下等日子 –

+0

+1這是一個很好的方法來解決這個問題。然後在一個普通的awk塊下,你可以用字段變量$ 1 - $ 7來操縱日子。 @djechlin,或許你提供了awk腳本的其餘部分作爲例子? – djhaskin987

0

可能是一個行提取將做的伎倆。嘗試ncal。例如:

$ ncal 
November 2012 
Mo  5 12 19 26 
Tu  6 13 20 27 
We  7 14 21 28 
Th 1 8 15 22 29 
Fr 2 9 16 23 30 
Sa 3 10 17 24 
Su 4 11 18 25 
0

或填充佔位缺席的日期(以「 - 」號爲例):

kent$ cal -s|tail -6|awk 'NR==1&&NF<7{gsub(/^ */,"");for(i=1;i<=(7-NF);i++) x=" - "x;$0=x" "$0;}1'      
- - - - 1 2 3 
4 5 6 7 8 9 10 
11 12 13 14 15 16 17 
18 19 20 21 22 23 24 
25 26 27 28 29 30 

,那麼你可以得到列,取代「 - 」與「」如果需要的話。例如對於$7:

kent$ cal -s|tail -6|awk 'NR==1&&NF<7{gsub(/^ */,"");for(i=1;i<=(7-NF);i++) x=" - "x;$0=x" "$0;}{print $7}' 
3 
10 
17 
24 
0

注意,今天的日期被高亮顯示,除非你將其關閉(-h)。使用cut提取想要的列:

cal -h | cut -c19-20 

輸出:

Sa 
3 
10 
17 
24