unix cal命令特殊字符

时间:2012-11-12 17:30:51

标签: shell unix awk cal

当我在我的unix机器上尝试“cal | tail -6”时,我得到了 -

             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和2栏。 6。 但由于“cal

的奇怪行为,我输错了

5 个答案:

答案 0 :(得分:8)

第一行中只有3个以空格分隔的列。 cal工作完全正确,您不了解awk的工作原理。就awk而言,第一行中没有第7列,因为它会引起对空白分隔列的注意,而不是固定宽度列。

快速谷歌搜索显示您可以使用

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

awk脚本中。

答案 1 :(得分: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/'

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

请注意,今天的日期会突出显示,除非您将其关闭(-h)。使用cut提取所需列:

cal -h | cut -c19-20

输出:

Sa
 3
10
17
24