请指教我的 awk 语法有什么问题以及如何修复它(这个语法在我的 ksh 脚本中)并且我在 linux 机器上运行我的脚本
我的目标是从 file.txt 中仅获取日期之间的行:
从 2012-04-19到 2012-04-22
备注-其他解决方案可以使用 perl
[root@test1 /var/tmp]# a='2012/04/19'
[root@test1 /var/tmp]# b='2012/04/22'
[root@test1 /var/tmp]# awk -v A=$a -v B=$b '/A/,/B/' file.txt
awk: syntax error near line 1
awk: bailing out near line 1
文件.txt
[ 2012/04/18 21:49:01:857 ] Monitor::handle_client_message():
[ 2012/04/18 21:50:02:379 ] Monitor::handle_client_message(
[ 2012/04/18 21:57:52:64 ] Monitor::handle_client_message():
[ 2012/04/18 21:57:52:252 ] Monitor::handle_client_message(
[ 2012/04/18 21:58:46:958 ] Monitor::handle_client_message():
[ 2012/04/19 21:58:46:958 ] Monitor::handle_client_message():
[ 2012/04/20 21:58:46:958 ] Monitor::handle_client_message():
[ 2012/04/21 21:58:46:958 ] Monitor::handle_client_message():
[ 2012/04/22 21:58:46:958 ] Monitor::handle_client_message():
答案1
您可以使用此命令:
$ awk '/2012\/04\/19/,/2012\/04\/22/' file.txt
您需要转义斜线,如图所示。
编辑:
可以使用如下变量来完成:
$ a='2012\/04\/19'
$ b='2012\/04\/22'
$ awk "/$a/,/$b/" file.txt
[ 2012/04/19 21:58:46:958 ] Monitor::handle_client_message():
[ 2012/04/20 21:58:46:958 ] Monitor::handle_client_message():
[ 2012/04/21 21:58:46:958 ] Monitor::handle_client_message():
[ 2012/04/22 21:58:46:958 ] Monitor::handle_client_message():
编辑2:
可以使用 done 命令来转义斜杠,sed
例如:
$ a='2012/04/19'
$ aa=$(echo $a | sed 's/\//\\\//g')
$ echo $aa
2012\/04\/19
然后,你可以aa
代替a
。同样,也可以对 进行操作b
。
答案2
以下是正确的做你想做的事。
您不想预先转义您的搜索模式,并且您应该使用-v
您在问题中显示的选项(但应该引用 shell 变量)。
当变量中有模式时,您不能使用//
来包围模式 - 您必须使用匹配运算符~
(波浪号)。
这对您的数据来说是正确的:
a='2012/04/19'
b='2012/04/22'
awk -v A="$a" -v B="$b" '$0 ~ A, $0 ~ B' file.txt
不能在里面放置变量的原因//
是变量名称中的字符被视为模式而不是变量的内容。