Awk 脚本帮助

Awk 脚本帮助

大家好,我是脚本新手,想看看为什么我会收到以下错误消息:

syntax error near unexpected token '$0'

使用此.sh文件重新排列.txt文件中的日期和时间,以便删除某些字符。

我有一个 awk.sh 文件,其中包含:

Match ($0 /\[(0-9]+)\/([A-Z][a-z]+)\/([0-9]+)([0-9]+:[0-9]+:[0-9]) \+[0-9]+\] matches)
printf("20%s 10%s 10%s 10%s\n",matches[1],matches[2],matches[3],matches[4])

只是不确定为什么我会收到此消息

log.txt 文件包含:

hello.googlebot.com - [10/December/2012:04:14:15 +0100] "GET /plain.txt HTTP/1.0" 132 12 "-" "Googlebot/2.1 (+http://www.google.com/bot.html)"  

所以我想要做的是在 .txt 文件中显示第二列(日期和时间):

10 December 2012 04:14:15 

不像上面那样,所以基本上去掉正斜杠,日期和时间之间的冒号,并删除+0100]

不知道我做错了什么

答案1

首先,要运行awk脚本,您需要使用awk解释器。您可以直接在命令行上执行此操作(awk '{print $2}' file),也可以创建 awk 脚本。需要以某种方式纳入awk方程式。您不能使用 shell 来运行awk命令,只能awk这样做。

在这种情况下,正如steeldriver向您展示的那样,脚本并不是真正需要的,但您也可以按照UNIX Way®并结合使用工具:

awk -F'[[ ]' '/hello.googlebot.com/{print $4}' log.txt | sed 's#:# #;s#/# #g'

解释

-F选项允许您选择字段分隔符,在本例中,我给它一个字符类包含两个字符:[(空格)。这意味着将按awk这些字符进行拆分。结果字段将是:

1 : hello.googlebot.com
2 : -
3 : 
4 : 10/December/2012:04:14:15

因此我打印第 4 个字段,并将其传递给sed只是:用空格 ( s#:# #) 替换第一个,并/用空格 (全部因为gs#/# #g)。


或者,你可以切换到perl整个操作:

perl -pe 's/.*?\[(.+?)\s\S+\].*/$1/; s/:/ /; s#/# #g' log.txt 

答案2

我还是不清楚确切地你想做什么,但可能最简单的方法是通过 awk 的子字符串替换函数sub和/或gsub例如

awk '/hello.googlebot.com/ {gsub("[[/]"," ",$3); sub(":"," ",$3); print $3}' logfile

请记住,默认情况下,awk 会在空格处进行拆分,因此计算 两侧的空格时-,日期字段$3不算$2

答案3

使用 GNU sed

sed '/hello.googlebot.com/ s/.* - \[\(.*\)\/\(.*\)\/\(.*\)\:\(.*\)\:\(.*\)\:\(.*\) .*\].*/\1 \2 \3 \4:\5:\6/g' file

例子:

$ echo 'hello.googlebot.com - [10/December/2012:04:14:15 +0100] "GET /plain.txt HTTP/1.0" 132 12 "-" "Googlebot/2.1 (+http://www.google.com/bot.html)"' | sed '/hello.googlebot.com/ s/.* - \[\(.*\)\/\(.*\)\/\(.*\)\:\(.*\)\:\(.*\)\:\(.*\) .*\].*/\1 \2 \3 \4:\5:\6/g'
10 December 2012 04:14:15

相关内容