awk中不止一个条件

时间:2014-01-19 14:12:54

标签: linux awk

我有一个包含以下格式的行的文件:

<firstname> <lastname> <day_of_birth> <month_of_birth> <year_of_birth>

我需要显示在当前日期庆祝生日的用户。

我设法编写脚本,但只检查当天==当天。

我如何用awk写行,我检查$ 3 == day,还检查$ 4 ==月和$ 5 ==年?谢谢

# get current date: day, month, year
day="$(date +'%d')"
month="$(date +'%m')"
year="$(date +'%Y')"

birthdays=$(awk "\$3~/$day/ {print \$1, \$2;}" users.lst)
echo $birthdays

4 个答案:

答案 0 :(得分:4)

你不能像这样在awk中包含变量。它可能会产生许多问题。您需要使用-v awk_var=$shell_var选项将shell变量传递给awk。

您可以使用此awk命令:

awk -v d=$day -v m=$month -v y=$year '$3==d && $4==m && $5==y {print $1, $2}' users.lst

但请注意GNU awk has built-in date/time functions,你可以避免在awk之前调用date命令3次:

awk '$3==strftime("%d") && $4==strftime("%m") && $5==strftime("%Y")
     {print $1, $2}' users.lst

答案 1 :(得分:4)

你没有发布任何样本输入,所以这是猜测,但这可能是你想要的:

awk -v date=$(date "+%d/%m/%Y") '$3"/"$4"/"$5 == date {print $1, $2}' file

答案 2 :(得分:3)

您可以在 awk内的中获取当前日期,如下所示:

awk 'BEGIN {
    "date +%d" | getline day
    "date +%m" | getline month
    "date +%Y" | getline year        
}
$3==day && $4==month && $5==year {
   print $1,$2
}' users.lst

答案 3 :(得分:1)

这是另一种方式:

awk '$3=="'$(date +%d)'"&&$4=="'$(date +%m)'"&&$5=="'$(date +%Y)'"{print $1,$2}' users.lst