如何在awk中从bash和字符串比较中传递参数?

时间:2011-10-11 13:58:33

标签: bash awk

如何将参数传递给awk以将字符串与管道输入进行比较? 例如,以下内容用于过滤特定文件夹

下2011年8月之前创建的文件
#!/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 }'

结果列出$ FILER_DIR下的所有文件而不进行过滤。 似乎AWK没有正确地从bash收到$ FILTER_BEFORE。 任何评论都表示赞赏!!

4 个答案:

答案 0 :(得分:4)

如果使用gawk,则将其作为参数传递

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

答案 1 :(得分:2)

您将需要使用双引号并转义其他AWK变量,以便它们不会被bash解释。

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

或者你可以将变量分解为双引号,这样就可以避免转义。

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

答案 2 :(得分:1)

我会选择:

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

或者这个( GNU find ):

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

答案 3 :(得分:0)

以下陈述似乎正常。 谢谢大家的帮助。

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