在bash中转义斜杠(awk)

dmg*_*rts 2 bash shell awk date sed

试图从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)
Run Code Online (Sandbox Code Playgroud)

如果我不必为此使用两个变量并且我确定我要提交各种其他罪行,那就更好了.

日志文件的示例行:

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"
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 7

您想要从匹配17/Nov/2015:16:36:45到最后的行打印所有内容.那么,你为什么不使用这种语法?

awk '$0 ~ /pattern/ {f=1} f' file
Run Code Online (Sandbox Code Playgroud)

这在首次看到模式时设置标志.从那一刻起,f条件为True,因此所有行都打印到文件的末尾.

在你的情况下,

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

  • 好的一个+1是的我认为这是OP需要的 (2认同)