【问题标题】:unix cal command special characterunix cal 命令特殊字符
【发布时间】:2012-11-12 17:30:50
【问题描述】:

当我在我的 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 和 6 列。 但是由于“cal”的奇怪行为,我得到了错误的输出

【问题讨论】:

    标签: shell unix awk cal


    【解决方案1】:

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

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

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

    在您的 awk 脚本中。

    【讨论】:

    • 这个问题有什么解决办法吗?我想要星期六/太阳等下的日子
    • +1 这解决这个问题的好方法。然后在正常的 awk 块下,您可以使用字段变量 $1 - $7 来操作日期。 @djechlin,也许您提供了 awk 脚本的其余部分作为示例?
    【解决方案2】:

    由于每行中的所有列都是三个字符宽,您可以使用它来提取您想要的日期。例如,如果您只希望列中的第 7 天,您可以执行以下操作:

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

    此命令将删除该行中的前 18 个字符,即一周中前 6 天的条目。

    要提取特定日期,例如第四天,您可以这样做:

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

    要删除一周的第一天和最后一天,您可以这样做:

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

    【讨论】:

    • 谢谢.. 对我有用.. 但我注意到你的最后一个命令中的某些内容,即使它不是星期六/太阳,它也会删除该月的最后一天。
    【解决方案3】:

    可能是按行提取就可以了。试试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
    

    【讨论】:

      【解决方案4】:

      或用占位符填充缺席日期(例如用'-'):

      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
      

      【讨论】:

        【解决方案5】:

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

        cal -h | cut -c19-20
        

        输出:

        Sa
         3
        10
        17
        24
        

        【讨论】:

          猜你喜欢
          • 2011-10-20
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-31
          相关资源
          最近更新 更多