Obtain date for first Tuesday of every month

Hi ,

Please help me out to write a shell script to obtain the date of first tueday of every month. I am new to shell scripting.

Appreciate your help Thanks.

 cal -m  | awk 'NR>2{Sfields=7-NF; if (Sfields == 1 ) {print $1;exit} if ( Sfields == 0) {  print $2;exit}}'

For every month of curren year

for i in `seq 12`; do cal -m $i `date '+%Y'` | awk 'NR>2{Sfields=7-NF; if (Sfields == 1 ) {print $1;exit} if ( Sfields == 0) {  print $2;exit}}' ; done

try this

cal 2013 | awk 'BEGIN{b[0]=3;b[1]=2;b[2]=1;b[3]=7;b[4]=6;b[5]=5;b[6]=4}($1 ~ /^S$/){x=1;mon1=p;getline;for(i=2;i<=NF;i++){if($i==1){a[x]=i;x++}};
 d1=7-a[1]+1;d2=7-(a[2]-a[1]);d3=7-(NF-a[2]+1);split(mon1,c);
 printf "%s_Tue:%d\n%s_Tue:%d\n%s_Tue:%d\n",c[1],b[d1],c[2],b[d2],c[3],b[d3]}{p=$0}' 

If you have ksh93 try this

$ cal 2013
                            2013
      January               February               March          
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
       1  2  3  4  5                  1  2                  1  2  
 6  7  8  9 10 11 12   3  4  5  6  7  8  9   3  4  5  6  7  8  9  
13 14 15 16 17 18 19  10 11 12 13 14 15 16  10 11 12 13 14 15 16  
20 21 22 23 24 25 26  17 18 19 20 21 22 23  17 18 19 20 21 22 23  
27 28 29 30 31        24 25 26 27 28        24 25 26 27 28 29 30  
                                            31                    

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

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

      October               November              December        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
       1  2  3  4  5                  1  2   1  2  3  4  5  6  7  
 6  7  8  9 10 11 12   3  4  5  6  7  8  9   8  9 10 11 12 13 14  
13 14 15 16 17 18 19  10 11 12 13 14 15 16  15 16 17 18 19 20 21  
20 21 22 23 24 25 26  17 18 19 20 21 22 23  22 23 24 25 26 27 28  
27 28 29 30 31        24 25 26 27 28 29 30  29 30 31              
                                                                  
$ cat First_Tuesday_In_Month.sh 
#!/bin/ksh
Year=2013

for i in {0..11}; do
    for j in {0..6}; do
    date=$(date -d"$((Year-1))1231 $j day $i month" +"%w %F")
    if [ ${date:0:1} -eq 2 ]; then
           echo ${date:2}
    fi
    done
done



$ ksh First_Tuesday_In_Month.sh 
2013-01-01
2013-02-05
2013-03-05
2013-04-02
2013-05-07
2013-06-04
2013-07-02
2013-08-06
2013-09-03
2013-10-01
2013-11-05
2013-12-03

@ pravin27 you are printing date of every monday...:slight_smile:

-m Display Monday as the first day of the week.

$ cal -m
    November 2013
Mo Tu We Th Fr Sa Su
             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

from man page on Ubuntu 12.04 LTS 32-Bit

     -m month
             Display the specified month.  If month is specified as a decimal number, it may be followed by the letter �f� or �p� to
             indicate the following or preceding month of that number, respectively.

on terminal

$ cal -m
cal: option requires an argument -- 'm'
Usage: cal [general options] [-hjy] [[month] year]
       cal [general options] [-hj] [-m month] [year]
       ncal [general options] [-bhJjpwySM] [-s country_code] [[month] year]
       ncal [general options] [-bhJeoSM] [year]
General options: [-NC3] [-A months] [-B months]
For debug the highlighting: [-H yyyy-mm-dd] [-d yyyy-mm]

Where as following one displays cal of Jan

$ cal -m 1
    January 2013      
Su Mo Tu We Th Fr Sa  
       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 31        
                      

Could be possible if you are using FreeBSD or RedHat

With full date format "dd-mm-yyyy"

 for i in `seq 12`; do cal $i `date '+%Y'` | awk -v month=$i -v year=`date '+%Y'` 'NR>2{Sfields=7-NF; if (Sfields == 0 ) {printf "%d-%02d-%d\n",$3,month,year;exit} if ( Sfields == 1) {printf "%d-%02d-%d\n",$2,month,year;exit} if ( Sfields == 2) {printf "%d-%02d-%d\n",$1,month,year;exit}}' ; done
#!/bin/ksh93

year=2013

for ((i=1; i<=12; i++ ))
do
    printf "%(%F)T\n" "first tues ${year}-${i}"
done