![Awk 脚本帮助](https://linux22.com/image/852396/Awk%20%E8%84%9A%E6%9C%AC%E5%B8%AE%E5%8A%A9.png)
大家好,我是脚本新手,想看看为什么我会收到以下错误消息:
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#:# #
) 替换第一个,并/
用空格 (全部因为g
在s#/# #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