簡體   English   中英

在bash中轉義斜杠(awk)

[英]Escaping slashes in bash (awk)

試圖從Apache日志文件中獲取一行和所有后續行我希望簡化以下內容:

# Convert epoch to format used in log file
gtime=$(date -d @$etime +"%d/%b/%Y:%T")  # "17/Nov/2015:16:36:45"
# Escape the slashes
g_tim=$(echo $gtime | sed 's/\//\\\//g') # "17\/Nov\/2015:16:36:45"
# Grab 
lines=$(awk '/$g_tim/,0' access.log)

如果我不必為此使用兩個變量並且我確定我要提交各種其他罪行,那就更好了。

日志文件的示例行:

djerk.nl:80 79.134.133.108 - - [17/Nov/2015:18:51:52 +0100] "GET /wordpress/2015/null HTTP/1.1" 103 16544 "http://www.djerk.nl/wordpress/2015/cisco-lacp-config-for-aruba-ap" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
djerk.nl:80 92.27.44.117 - - [17/Nov/2015:18:52:28 +0100] "GET /djerk_nl.pac HTTP/1.1" 403 1147 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"

您想打印從17/Nov/2015:16:36:45到最后一行的所有內容。 那么,你為什么不使用這種語法?

awk '$0 ~ /pattern/ {f=1} f' file

這在首次看到模式時設置標志。 從那一刻開始, f condition為True,所以所有行都打印到文件的末尾。

在你的情況下,

awk -v date="$(date -d @$etime +"%d/%b/%Y:%T")" '$0~date {f=1}f' file

從你的評論中聽起來你並不真的想要grab a line and all following lines ,而是想要打印在給定時間戳之后或之后開始的所有行。 那將是:

$ cat tst.awk
BEGIN { FS="[][ /:]+"; mths="JanFebMarAprMayJunJulAugSepOctNovDec" }
f { print; next }
{ logTime = sprintf("%04d%02d%02d%02d%02d%02d",$8,(match(mths,$7)+2)/3,$6,$9,$10,$11) }
logTime >= tgtTime { f=1 }

$ awk -v tgtTime="$(date -d @"$etime" +"%Y%m%d%H%M%S")" -f tst.awk file

請注意,我更改了date時間spec args以生成用於比較的新時間戳格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM