Help with find, xargs and awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Help with find, xargs and awk
# 1  
Old 10-06-2012
Data Help with find, xargs and awk

Hi,

I want to find some files and then search for some lines in it with a particular pattern and then write those lines into a file. To do this I am using something like this from command prompt directly.
Code:
cd /mdat/BVG
find -name "stmt.*cl" -newer temp.txt | xargs -i awk '/BVG-/{print}' {} > /home/sandhya/list.txt
#awk -f BVG-stmt.awk /home/sandhya/list.txt > /home/sandhya/BVG-Statement-detail.txt


This works absolutely fine. But I have lots of directories in mdat and I have to do the same action in all of it. So I decided to write a shell script so that it works for all. Below is the shell script code for it. But the problem is that when I execute the above commands from shell script, I do not get the desired output. Can anybody help me out?

*****************************************************
Shell Script
*****************************************************
Code:
DESTDIR=/home/sandhya
CLIENT_NAME=

while [ -z "${CLIENT_NAME}" ]
do
    echo "Enter Client Short Name :(<Ctrl>-C, <Enter> to cancel): \c"
    read CLIENT_NAME
done

CLIENT_NAME=`echo $CLIENT_NAME | tr '[:lower:]' '[:upper:]'`

if [ -d /mdat/${CLIENT_NAME} ]
    then
    echo "Client is valid!!"
else
    echo "\n Client ${CLIENT_NAME} does not exist. Try again!!\n"
    exit 1
fi

cd /mdat/${CLIENT_NAME}

LNAME=${DESTDIR}/list.txt
#SDNAME=${DESTDIR}/${CLIENT_NAME}-Statement-detail.txt
#AWKF=${CLIENT_NAME}-stmt.awk

find -name "stmt.*cl" -newer temp.txt | xargs -i awk '/${CLIENT_NAME}-/{print}' {} > ${LNAME}
#awk -f ${AWKF} ${LNAME} > ${SDNAME}

*********************************************************

Note: The contents of awk file is same only difference is the pattern BVG replaced with other appropriate client names/dirs.
OS: QNX 4.25

Thanks in advance for your help.

Sandhya.

Moderator's Comments:
Mod Comment Please use code tags next time for your code and data.

Last edited by radoulov; 10-06-2012 at 09:04 AM..
# 2  
Old 10-06-2012
Change
Code:
find -name "stmt.*cl" -newer temp.txt | xargs -i awk '/${CLIENT_NAME}-/{print}' {} > ${LNAME}

to
Code:
find . -name "stmt.*cl" -newer temp.txt | xargs -i awk -v cn="$CLIENT_NAME-" 'index($0,cn)' {} > $LNAME

And if you are running this in a loop, change > to >>.

Last edited by elixir_sinari; 10-06-2012 at 09:23 AM..
# 3  
Old 10-06-2012
Data Not Worked!

Hi Gotham,

When I used the command your way , i get file of 0 size. But the earlier code was giving me file of 307 KB.

Sandhya.
# 4  
Old 10-06-2012
Sandhya,
try to change ur code with double quotes and let me know ..
Code:
awk "/${CLIENT_NAME}-/{print}"


Last edited by Scott; 10-08-2012 at 03:39 PM.. Reason: Code tags
# 5  
Old 10-06-2012
Sandhya && Lohith:
Where is the >> in your code? That is the problem. Elixir gave instructions about adding >>.

I should also mention: if you rerun code with different input files truncate (set to zero length"
Code:
> $LNAME

at the VERY first line of your code. Otherwise >> will add the new data to the END of the old data.
# 6  
Old 10-06-2012
If your find supports the POSIX-standard -exec ... {} + primary, then you don't need xargs. You can just use find to invoke cat with many file arguments and feed that directly to awk.

Regards,
Alister
# 7  
Old 10-08-2012
Thanks lohitdutta!

Thanks lohitdutta. Double quotes worked!! Can you explain the difference in behaviour of Single and double quote when used in script?

Also I tried to use cat and grep instead of xargs and awk and I got the correct result.

Now which is better? xrags-awk combi or cat-grep combi with find.

Sandhya.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

xargs vs exec with find:

Hi All, i'm trying to create a tar of all the .txt files i find in my dir . I've used xargs to acheive this but i wanted to do this with exec and looks like it only archives the last file it finds . can some one advice what's wrong here : find . -type f -name "*.txt" -print0 | xargs -0... (9 Replies)
Discussion started by: Irishboy24
9 Replies

2. UNIX for Dummies Questions & Answers

find/xargs/*grep: find multi-line empty "try-catch" blocks - eg, missing ; not in a commented block

How can I recursively find all files in a directory and print out the file and first line number of any text blocks that match the below cases? This would seem to involve find, xargs, *grep, regex, etc. In summary, I want to find so-called empty "try-catch blocks" that do not contain code... (0 Replies)
Discussion started by: lifechamp
0 Replies

3. Shell Programming and Scripting

Xargs + Find Help

Guys i want to run a command to list all directories that havn't been modified in over 548 days ( 1.5 yrs ). Id like to run a script to first print what the command finds ( so i get a list of the files pre move ... i have a script set for this : find /Path/Of\ Target/Directory/ -type d -mtime... (4 Replies)
Discussion started by: modulartention
4 Replies

4. Shell Programming and Scripting

find and xargs

hi, i've been trying to figure this weird error but I cannot seem to know why. I am using below find command: find . \( ! -name . -prune \) -type f -mtime +365 -print The above code returns no file because no files are really more then 365 days old. However, when I use xargs, its... (9 Replies)
Discussion started by: The One
9 Replies

5. UNIX for Dummies Questions & Answers

XARGS and FIND together

I am trying to delete files older than 60 days from a folder: find /myfolder/*.dat -mtime +60 -exec rm {} \; ERROR - argument list too long: find I can't just give the folder name, as there are some files that I don't want to delete. So i need to give with the pattern (*.dat). I can... (3 Replies)
Discussion started by: risshanth
3 Replies

6. Solaris

Piping results of 'ls' to 'find' using 'xargs'

I'm trying to get a count of all the files in a series of directories on a per directory basis. Directory structure is like (but with many more files): /dir1/subdir1/file1.txt /dir1/subdir1/file2.txt /dir1/subdir2/file1.txt /dir1/subdir2/file2.txt /dir2/subdir1/file1.txt... (4 Replies)
Discussion started by: MartynAbbott
4 Replies

7. Shell Programming and Scripting

find | xargs cat

Hi, I am having trouble getting a combination of commands to work. I need to traverse through all sub-directories of a certain directory and 'cat' the contents of a particular file in the sub-directories. The commands on their own work but when I combine them I get no output. The... (4 Replies)
Discussion started by: DownunderDave
4 Replies

8. UNIX for Dummies Questions & Answers

Combination of find -xargs & wc -l

Dear all, I have to calculate sum of record count of files of the specified directory. First I tried the following way which prints one or more outputs. How can I sum of this output? find /home/work/tmp/1/O/ -type f -print0 | xargs -0 wc -l | grep total 1666288 total 1073908 total ... (4 Replies)
Discussion started by: mr_bold
4 Replies

9. Shell Programming and Scripting

Problem using find and xargs

I'm using Imagemagick to create thumbnails for a large directory tree. The only thing I can't see is how to get it to write the thumbnails to a "thumbs" subdirectory! Either of these two commands from the Imagemagick site does most of the job: find -name '*.jpg' | xargs -n1 sh -c 'convert $0... (5 Replies)
Discussion started by: quixote
5 Replies

10. Shell Programming and Scripting

find | xargs cat

Hai I just want to find a file *.txt in particular direcotry and display the file name puls the content. Do someone know hot to do this, thanks. I try : find test/ -name '*.txt' | xargs cat but It does'nt print out the file name, i want something below print out in my screen : test/1.txt... (4 Replies)
Discussion started by: asal_email
4 Replies
Login or Register to Ask a Question