ori_lin
ori_lin

Reputation: 1

How to pass parameter from bash and string comparison in awk?

How to pass a parameter to awk to compare the string with pipe input? For example, followings are used to filter files created before Aug 2011 under specific folder

#!/bin/bash
$FILTER_DIR=$1

# file date before it should be listed.
FILTER_BEFORE="2011-08"

# $6 in awk statement is date of file name($8)
find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le $FILTER_BEFORE ) { print $8 }'

The result list all files under $FILER_DIR without filtering. It seems AWK didnot receive $FILTER_BEFORE from bash properly. Any comment is appreciated!!

Upvotes: 0

Views: 1702

Answers (4)

Matt
Matt

Reputation: 8476

if using gawk, pass it as a parameter

find $1 -type f | 
sed 's/^/ls -l /g' | 
sh | 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 <= filter_before ) { print $8 } }'

Upvotes: 4

ori_lin
ori_lin

Reputation: 1

Following statements seem work properly. Thanks for everybody's help.

find $1 -type f | \ 
sed 's/^/ls -l /g' | \ 
sh | \ 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 < filter_before ) { print $8 } }'

Upvotes: 0

Dimitre Radoulov
Dimitre Radoulov

Reputation: 28000

I'd go with:

touch -t 201107302359 30_july_2011
find . -type f ! -newer 30_july_2011 

Or this (GNU find only):

find . -type f ! -newermt '2011-07-30 23:59' 

Upvotes: 1

Kurt Stutsman
Kurt Stutsman

Reputation: 4034

You will need to use double quotes and escape the other AWK variables so they don't get interpreted by bash.

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk " if ( \$6 le \"$FILTER_BEFORE\" ) { print \$8 }"

Alternatively you can break out just the variable into double quotes so you can avoid escaping.

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le "'"$FILTER_BEFORE"'" ) { print $8 }'

Upvotes: 2

Related Questions