DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   Shell Scripting (http://www.daniweb.com/forums/forum113.html)
-   -   Awk question (http://www.daniweb.com/forums/thread117278.html)

mooglor Apr 3rd, 2008 5:22 pm
Awk question
 
#!/bin/bash
ARCHIVE_PATH=/archive
CURRENT_DATE='date +%F%H%M%S'
echo running at `date` >>~/Logs.txt

for FolderToSearch in $(ls -l /home/stuff/tp |grep ^d|awk '{print $9}');
do find /home/stuff/tp/$FolderToSearch/in -name '*.*'|awk '{print "zip -m " $ARCHIVE_PATH "_" $FolderToSearch "zip2arc.zip" $CURRENT_DATE;}'|bash|tee -a ~/Logs.txt;
done

Hi there,
I'd appreciate it if anyone can tell me how to use variables within the print statement of an awk statement. The above code is meant to
1. List a directory.
2. For each subdirectory, list the files in its in/ folder.
3. Zip these files into a /archive/zip file (also removing them zip -m)
Ideally, the zip file would have the name of the folder it came from as a prefix of its filename and the date as postfix.

The problem is that $CURRENT_DATE and $ARCHIVE_PATH are not expanded to their values. I've tried using single quotes etc.Note that this is on AIX, where find and awk, although very similar, are a little bit primitive compared to their GNU counterparts.
If anyone can recommend a good hair transplant clinic too I'd be eternally in your debt.

Thanks in advance.

mooglor Apr 3rd, 2008 7:45 pm
Re: Awk question
 
I just noticed that I pasted a small problem, missing the $1.
Just to clarify a little:

My problem is specifically with this line:

awk '{print "zip -m " $ARCHIVE_PATH  $FolderToSearch "zip2arc.zip" $CURRENT_DATE " " $1;}'

I expect it to ouput this:
zip -m archive/Folder1zip2arc.zip2008-04-03113933 Filename1

But it outputs:
zip -m zip2arc.zip Filename1

...leaving out all of the variables.

eggi Apr 3rd, 2008 11:31 pm
Re: Awk question
 
Hey There,

The issue may be resolved by just using double quotes around your statement to expand variables from the shell within awk, like:

awk "{print "zip -m " $ARCHIVE_PATH  $FolderToSearch "zip2arc.zip" $CURRENT_DATE " " $1;}"

If you want to specifically set a variable within the awk statement, you can set it like

var=value

and then expand it using

print $var

It can be a bit tricky if you want to combine the two, since $1 in awk is distinctly different from $1 in the shell, depending.

Hopefully some of that is helpful :)

, Mike

chrisgood60 Apr 4th, 2008 9:52 pm
Re: Awk question
 
The problem is that those variables are within single quotes so are not expanded.
You need to end the single quote before the variable and start it again after the variable when building your awk script
eg echo 'This is singlequoted - TERM='$TERM' this is also single quoted'

ghostdog74 Apr 5th, 2008 6:22 am
Re: Awk question
 
use the -v option of awk to pass in shell variables so that you don't have to get too confused between shell and awk variables.
eg
awk -v archive="$ARCHIVE" ' { 
  print archive
  # etc code
}

also you do not need to use ls , grep and awk just to get directory names. you can use find.
for foldersearch in `find /path -type d`
do
 ...
done


All times are GMT -4. The time now is 7:56 am.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC