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

awk:从bash传递变量以在if语句中使用,bash,awk,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" &&

我正在尝试列出在下午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
    }
}'
last | awk-v month=“$month”{
如果($5==月份和$6==“19”和$7<“14:00”){
printf“%s\n”,$0
}
}'
最后| awk-v month=“$month”-v yesteday=“$dayed”'{
如果($5==月份和$6==昨天和$7<“14:00”){
printf“%s\n”,$0
}
}'
这两种尝试都没有成功。但是,如果我将变量设置为像“Apr”这样的字符串,它确实可以工作。像这样:

last | awk -v month="Apr" '{
    if($5==month && $6=="19" && $7 < "14:00"){
        printf "%s\n",$0
    }
}'
last | awk-v month=“Apr”'{
如果($5==月份和$6==“19”和$7<“14:00”){
printf“%s\n”,$0
}
}'
下面是它使用上述命令的输出

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


谢谢。

出于调试目的,请查看您的
月份实际设置为什么。对我来说,这绝对不是
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
实现,您可以使用其格式选项:

pax$ date +%b
Apr
这可能比摆弄整个日期要好得多。在您的案例中,归结起来就是简单地设置
月份

month=$(date +%b)


但是,即使修复了它也不会对您有所帮助,因为您提供的脚本无法生成您指定的输出(除非您已从左侧截断字段)。您的脚本将分别在字段6和字段7中调用moth和day,但输出显然在字段2和字段3中。

仅出于调试目的,请了解您的
月份的实际设置。对我来说,这绝对不是
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
实现,您可以使用其格式选项:

pax$ date +%b
Apr
这可能比摆弄整个日期要好得多。在您的案例中,归结起来就是简单地设置
月份

month=$(date +%b)


但是,即使修复了它也不会对您有所帮助,因为您提供的脚本无法生成您指定的输出(除非您已从左侧截断字段)。您的脚本要求moth和day分别位于字段6和字段7中,但输出显然位于字段2和字段3中。

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

首先,应从此处删除尾随的新行:

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"

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

我发现您的代码有两个问题

首先,应从此处删除尾随的新行:

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"

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

$date太阳PDT四月22日19:39:552018@Camilo
date
的默认输出格式取决于您的区域设置(可能还有其他内容),因此最好指定一种格式(如
%b
),而不是取决于默认格式。$date Sun Apr 22 19:39:55 PDT2018@Camilo
date
的默认输出格式取决于您的语言环境(可能还有其他内容),因此最好指定一种格式(如
%b
),而不是取决于默认格式。您是否可以包括一些包含月份的输入数据,其价格为
$5
?另外,您使用的是什么操作系统?(即
日期的哪个版本--GNU、BSD或其他?)另外,请考虑将格式化文本粘贴到您的问题而不是图像中。如果我们想复制您的结果,我们不必重新键入代码和输入数据。您可以包含一些包含“代码< 5美元< /代码>的月份”的输入数据吗?还有,您使用的是什么操作系统?(即,
日期的哪个版本--GNU、BSD、其他内容?)另外,请考虑将格式化文本粘贴到您的问题而不是图像中。如果我们想复制您的结果,我们不必重新键入代码和输入数据。谢谢!我认为它不起作用,因为我的变量包括尾随新行。它现在起作用。我应该已经意识到了。谢谢!CAMILO -警告…YOU现在可以很好地解决这个问题,但不是用失败来解决它。是的,你可以删除新行,但是如果你先做得更好,你就不必放弃新行。请考虑切换PAX的代码>日期+ %B/<代码>建议,并考虑你的脚本在开始时会做什么。这个月。将帮助您。(从5月1日的角度来看,“昨天”将不是5月0日。)谢谢,我将改进它以涵盖这些情况。@Camilo,尝试自己调试它。尝试一些测试脚本。例如,
echo 1 | awk-v ystd=$(date--date date=“昨天”+%d){pr