awk + ​​perl + 将两个参数放入 awk 语法中

awk + ​​perl + 将两个参数放入 awk 语法中

请指教我的 awk 语法有什么问题以及如何修复它(这个语法在我的 ksh 脚本中)并且我在 linux 机器上运行我的脚本

我的目标是从 file.txt 中仅获取日期之间的行:

2012-04-192012-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

不能在里面放置变量的原因//是变量名称中的字符被视为模式而不是变量的内容。

相关内容