awk字符串大于变量

时间:2018-11-01 14:24:01

标签: awk

对于Linux和awk来说还很陌生,这个问题使我陷入了困境。打赌,很容易使其工作。所以我有这个很好的命令。仅将比分钟时间戳晚的行打印为文本。

awk -F\" '$0> "[01/Nov/2018:15:58" {print $0}' localhost_access_log.2018-11-01.txt

日志文件的格式如下

[01/Nov/2018:15:53:16 +0200] x.x.x.10 "-" "-" "libwww-perl/6.13" "GET /manager/status?XML=true HTTP/1.1" 401 2473 1
[01/Nov/2018:15:53:16 +0200] x.x.x.10 "-" "-" "libwww-perl/6.13" "GET /manager/status?XML=true HTTP/1.1" 200 3070 4
[01/Nov/2018:15:58:16 +0200] x.x.x.10 "-" "-" "libwww-perl/6.13" "GET /manager/status?XML=true HTTP/1.1" 401 2473 2
[01/Nov/2018:15:58:16 +0200] x.x.x.10 "-" "-" "libwww-perl/6.13" "GET /manager/status?XML=true HTTP/1.1" 200 3070 4

但是从bash脚本运行相同的命令将无法正常工作。下面显示了日志文件中的 all 行。

#!/usr/bin/bash

STAMP=$(date --date '-15 min' "+%d/%b/%Y:%H:")
MIN1=$(date --date '-15 min' "+%M")
MIN1=${MIN1:0:2}
STAMP=$STAMP$MIN1
LOGSTAMP=$(date +%Y-%m-%d)

awk -F\" '$0> "$STAMP" {print $0}' localhost_access_log.$LOGSTAMP.txt

更改“ $ STAMP”-> $ STAMP将不会显示任何内容

awk -F\" '$0> $STAMP {print $0}' localhost_access_log.$LOGSTAMP.txt

你能帮忙吗?

2 个答案:

答案 0 :(得分:2)

Bash变量在awk中不起作用。您必须使用-v标志将它们传递到awk脚本中的awk变量中:

#!/usr/bin/bash

STAMP=$(date --date '-15 min' "+%d/%b/%Y:%H:")
MIN1=$(date --date '-15 min' "+%M")
MIN1=${MIN1:0:2}
STAMP=$STAMP$MIN1
LOGSTAMP=$(date +%Y-%m-%d)

awk -F\" -v stamp="$STAMP" '$0>stamp {print $0}' localhost_access_log.$LOGSTAMP.txt

答案 1 :(得分:0)

要将shell变量放入Awk程序字符串中,您需要在引用前(单引号)变量之前终止单引号字符串,并在引用后将其重新启动。变得很复杂:

awk -F'"' '$0> "'"$STAMP"'" {print $0}' localhost_access_log.$LOGSTAMP.txt

awk看到的程序是:

$0 > "01/Nov/2018:13:15" { print $0 }