Unix/Linux Go Back    


Red Hat Red Hat is the world's leading open source technology solutions provider with offerings including Red Hat Enterprise Linux (RHEL), Fedora, open source applications, security and systems management, virtualization, and Services Oriented Architecture (SOA) solutions.

Error when executing script

Red Hat


Reply    
 
Thread Tools Search this Thread Display Modes
    #8  
Old Unix and Linux 05-05-2017
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 20 July 2017, 7:02 AM EDT
Posts: 83
Thanks: 4
Thanked 0 Times in 0 Posts
I don't know if the method I am using is complex, but the aim of this script is to generate reports every 1st, 7th and 15th of every month. However, the reports won't be generated until a few days after these dates. Like the reports for the 1st will be generated on the 5th of the month for example. And reports for the 7th will be generated on the 9th or 10th. And reports for the 15th will be generated on the 17th. These days of course will have to fall on a weekday, and not a weekend, which is why we cannot put a fixed date, for each batch.

For the reports on the 1st, I have to copy files dated 2nd onwards from the main directory that it was generated in, into another directory.
This is why I am cracking my head on how to get this done.

For example, these are the files listed in the main directory :


Code:
-rw-r-----  1 Debian-exim adm  1705192 May  1 06:25 mainlog.5.gz
-rw-r-----  1 Debian-exim adm 16737648 May  2 06:25 mainlog.4.gz
-rw-r-----  1 Debian-exim adm 11031310 May  3 06:33 mainlog.3.gz
-rw-r-----  1 Debian-exim adm  8258806 May  4 06:28 mainlog.2.gz
-rw-r-----  1 Debian-exim adm 37434708 May  5 06:26 mainlog.1
-rw-r-----  1 Debian-exim adm 14248899 May  5 17:43 mainlog
root@L28mustang:/var/log/exim4#

I have to copy these files, as you can see, dated May 2nd onwards till the latest (in this case, the 5th) to another directory. How do I create a bash script to do this? These are however not the only files here. There are older files from previous months also here. I need to copy over only the latest months' files dated 2nd onwards to another directory. The script has to be intelligent enough to recognize the files needed for that particular batch (1st, 7th, or 15th), and copy it over to another directory.

Then once it has been copied over to the other directory, this command has to be executed :


Code:
exigrep L28stream1 mainlog.2.gz | egrep -v "jiun.shyong.hor@ericsson.com|chander.c.shekher@ericsson.com|nagios|L28eagle" > mainlog.2.filtered

Means the oldest mainlog file will be labelled with the higher number. In the example above, the date of the oldest file was 16th (this was for batch 15). The report was generated on the 17th. Therefore the name of the oldest mainlog file will be "mainlog.2". Then there were 2 mainlog files generated on the 17th, which was mainlog.1 and mainlog.

This is the script that I have created so far. Any corrections and additional advise will definitely be very appreciated :


Code:
#!/bin/bash

DAY=$(date + %d)
MONTH=$(date +%b)
YEAR=$(date +%Y)
BC01="Blast_BC01"
BC15="Blast_BC15"
DIR1=$MONTH$YEAR_$BC01
DIR2=$MONTH$YEAR_$BC15
FOLDER=$YEAR

DIGMON=$(date +%m)

D=$(stat -c %z mainlog.* | awk -F"[ -]" '{print $3}')
FDAY=$(date -d "$D" '+%d')
FMON=$(date -d "$D" '+%m')
FYEAR=$(date -d "$D" '+%Y')

FILEDATE=$YEAR"-"$DIGMON"-"$i

cd /var/log/exim4

if [ ! -d "$YEAR" ]; then
    mkdir $YEAR
        if [ $DAY < 15 ];then
            mkdir -p /var/log/exim4/$YEAR/$DIR1
            for (( $D=2; $D<=$DAY; $D++ ))
                cp -p mainlog* ./$YEAR/$DIR1
            
        else
            mkdir -p /var/log/exim4/$YEAR/$DIR2
            for (( $D=16; $D<=$DAY; $D++ ))
                cp -p mainlog* ./$YEAR/$DIR2
        fi
else
    cd $FOLDER
        if [ $DAY < 15 ];then
            mkdir -p /var/log/exim4/$YEAR/$DIR1
            for ($D=2; $D<$DAY; $D++)
                cp -p mainlog* ./$YEAR/$DIR1
                    cd /$YEAR/$DIR1
                    count=$(ls -lrt | wc -l)
                    for (i=;i<=$count;i++)
                    exigrep L28stream1 mainlog.$count.gz | egrep -v "jiun.shyong.hor@ericsson.com|chander.c.shekher@ericsson.com|nagios|L28eagle" > mainlog.$count.filtered
            
        else
            mkdir -p /var/log/exim4/$YEAR/$DIR2
            for ($D=16; $D<$DAY; $D++)
                cp -p mainlog* ./$YEAR/$DIR2
        fi
fi

---------- Post updated at 06:32 PM ---------- Previous update was at 06:18 PM ----------

For TESTING purposes ONLY, however, I tried running some commands from the terminal to copy files from the directory /home/emokheng to /home/emoaigin :

These are the files in /home/emokheng :


Code:
[root@L28tstream1 emokheng]# ls -lrt
total 8
-rw-rw-r-- 1 emokheng emokheng 328 Aug 18  2015 foreign.pl
-rw-rw-r-- 1 emokheng emokheng  91 Aug 18  2015 afterinstallforeign.pl

As you can see the dates of the files are August 18th. For report generation this will be considered batch 15. These are the steps I have performed :


Code:
[root@L28tstream1 emokheng]# D="$(stat -c %z * | awk -F"[ -]" '{print $3}')"
[root@L28tstream1 emokheng]# echo "$D"
18
18
[root@L28tstream1 emokheng]# for (( "$D"=16; "$D"<=20; "$D"++ ));
> do
> cp -r * /home/emoaigin/
> done
-bash: ((: 18
18=16: syntax error in expression (error token is "18=16")
[root@L28tstream1 emokheng]#

What is wrong in these steps? Why does it not recognize files dated 18th and copy it over?
Sponsored Links
    #9  
Old Unix and Linux 05-05-2017
RudiC RudiC is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 20 July 2017, 4:54 AM EDT
Location: Aachen, Germany
Posts: 11,050
Thanks: 284
Thanked 3,405 Times in 3,135 Posts
You can't use it like that: for (( "$D"=16; "$D"<=20; "$D"++ ));. Use unexpanded variable names like for (( i=1; i<5; i++ )); do echo $i; done. $D is already expanded by the shell.
Sponsored Links
    #10  
Old Unix and Linux 05-05-2017
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 20 July 2017, 7:02 AM EDT
Posts: 83
Thanks: 4
Thanked 0 Times in 0 Posts
But I want to copy files with a certain date over from one dir to another.
How do i do this?

I tried using the for loop like this :


Code:
[root@L28tstream1 emokheng]# for (( i=16; i<20; i++ ));
> do
> cp -r * /home/emoaigin/;
> done
cp: overwrite `/home/emoaigin/afterinstallforeign.pl'? y
cp: overwrite `/home/emoaigin/foreign.pl'? y
cp: overwrite `/home/emoaigin/afterinstallforeign.pl'? y
cp: overwrite `/home/emoaigin/foreign.pl'? y
cp: overwrite `/home/emoaigin/afterinstallforeign.pl'? y
cp: overwrite `/home/emoaigin/foreign.pl'? y
cp: overwrite `/home/emoaigin/afterinstallforeign.pl'? y
cp: overwrite `/home/emoaigin/foreign.pl'? y
[root@L28tstream1 emokheng]#

As you can see, it does the loop for times, (i.e copying 2 files 4 times).
This is not I want. What I want is for the script to recognize the files dated from the 16th to the latest date, and copy it over to the other directory, without repeating or overwriting like above.

Is this possible?
    #11  
Old Unix and Linux 05-05-2017
MadeInGermany MadeInGermany is online now Forum Advisor  
Registered User
 
Join Date: May 2012
Last Activity: 20 July 2017, 2:38 PM EDT
Location: Simplicity
Posts: 3,631
Thanks: 285
Thanked 1,211 Times in 1,096 Posts
Again, the $D is an argument and need to be in quotes.

Code:
echo $D

lets the shell do variable substitution then word splitting then globbing (replace wildcards with matching filenames). The word splitting reformats the line breaks to spaces.

Code:
echo "$D"

lets the shell do variable substitution only.
Sponsored Links
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Linux More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Error while executing a script samsungsamsung Shell Programming and Scripting 1 11-17-2010 03:29 AM
Error Executing the script. pinga123 UNIX for Dummies Questions & Answers 5 07-08-2010 07:02 AM
Error while executing the below script chinniforu2003 Shell Programming and Scripting 3 11-09-2009 03:43 PM
Error while executing a script shwetainnani Shell Programming and Scripting 15 10-09-2009 09:12 AM
error while executing the script dsdev_123 Shell Programming and Scripting 2 03-30-2009 05:46 PM



All times are GMT -4. The time now is 02:45 PM.