awk:从bash传递变量以在if语句中使用

时间:2018-04-23 02:39:31

标签: bash awk

我试图将下午2点之前登录的最后用户列入计算机。我设置了两个bash变量,用于管道输入到awk的最后一个命令。

month=$(date | awk '{printf"%s\n",$2}')
yesterday=$(date | awk '{printf"%s\n",$3-1}')

然后我尝试使用这两个变量,但是当我这样做时它不起作用。

last | awk -v month="$month"'{
    if($5==month && $6=="19" && $7 < "14:00"){
        printf "%s\n",$0
    }
}'

last | awk -v month="$month" -v yesteday="$yesterday" '{
    if($5==month && $6==yesterday && $7 < "14:00"){
        printf "%s\n",$0
    }
}'

这两种尝试均无效。但是,如果我将变量设置为类似&#34; Apr&#34;它确实有效。像这样:

last | awk -v month="Apr" '{
    if($5==month && $6=="19" && $7 < "14:00"){
        printf "%s\n",$0
    }
}'

以下是使用上述命令的输出。

output for last|awk

我的问题是,我怎样才能使用我的bash变量?我看了类似的问题,但那些对我没有帮助。如果我设置它们然后使用awk打印它们,我的bash变量可以工作,但是当我在if语句中使用它时它不起作用。

谢谢。

2 个答案:

答案 0 :(得分:1)

仅出于调试目的,找出month实际设置的内容。对我来说绝对不是Apr

pax$ date
Monday 23 April  10:58:57 AWST 2018
pax$ date | awk '{printf"%s\n",$2}'
23

此处,月份保存在第三个​​字段中,无论如何,它似乎是月份的形式,而不是简短形式。所以你可能认为你可以简单地修改命令以适应你的情况,例如:

pax$ date | awk '{printf"%s\n",substr($3,1,3)}'
Apr

当然,只有当您的date输出与我的相似时才会起作用,可能无法保证。如果你有足够好的date实现,你可以使用格式选项:

pax$ date +%b
Apr

这可能会好得多,而不是在操纵整个约会。在您的情况下归结为简单地设置month因此:

month=$(date +%b)

但是,即使修复 也不会在这里帮助你,因为你提供的脚本产生了你指定的输出 no 方式(除非你从左边切掉了字段)。你的脚本要求将moth和day分别放在字段6和7中,但输出显然在字段2和3中有。

答案 1 :(得分:1)

我发现您的代码存在两个问题。

首先,你应该从这里删除尾随的新行:

month=$(date | awk '{printf"%s\n",$2}')
yesterday=$(date | awk '{printf"%s\n",$3-1}')

应该是:

month=$(date | awk '{printf"%s",$2}')
yesterday=$(date | awk '{printf"%s",$3-1}')

或者只是:

month=$(date | awk '{print $2}')
yesterday=$(date | awk '{print $3-1}')

其次,你有一个错字:

-v yesteday="$yesterday"

应该是:

-v yesterday="$yesterday"

除此之外,您的代码适用于我(假设您在屏幕截图中删除了三个字段)。