如何将参数传递给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。 任何评论都表示赞赏!!
答案 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 } }'