我试图将下午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
}
}'
以下是使用上述命令的输出。
我的问题是,我怎样才能使用我的bash变量?我看了类似的问题,但那些对我没有帮助。如果我设置它们然后使用awk打印它们,我的bash变量可以工作,但是当我在if语句中使用它时它不起作用。
谢谢。
答案 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"
除此之外,您的代码适用于我(假设您在屏幕截图中删除了三个字段)。