作为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脚本中运行相同的命令将不能正常工作。下面将打印日志文件中的所有行。
#!/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你能帮上忙吗?
发布于 2018-11-01 15:10:53
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发布于 2018-11-01 15:23:46
要将shell变量放入Awk程序字符串,您需要在引用(引用)变量后终止单引号字符串并重新启动它。它变得复杂起来:
awk -F'"' '$0> "'"$STAMP"'" {print $0}' localhost_access_log.$LOGSTAMP.txt那么,awk所看到的程序是:
$0 > "01/Nov/2018:13:15" { print $0 }https://stackoverflow.com/questions/53103245
复制相似问题