awk + ​​perl +得到awk语法的两个参数

请咨询我的awk语法有什么问题,以及如何解决这个问题(这个语法是在我的ksh脚本中),我在Linux机器上运行我的脚本

我的目标是从file.txt只得到date之间的行:

2012年4月19日2012年4月22日

备注 – 其他解决scheme可以用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 

file.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(): 

你可以使用这个命令:

 $ awk '/2012\/04\/19/,/2012\/04\/22/' file.txt 

你需要像图中所示的那样跳过斜线。

编辑:

它可以使用像这样的variables来完成:

 $ 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(): 

EDIT2:

转义斜线可以使用完成sed命令,如:

 $ a='2012/04/19' $ aa=$(echo $a | sed 's/\//\\\//g') $ echo $aa 2012\/04\/19 

那么,你可以代替a 。 同样,可以为b完成。

以下是做你想做的正确的方法。

你不想预先逃避你的search模式,你应该使用-v选项,就像你在问题中显示的那样(但是应该引用shellvariables)。

当你在variables中有模式时,你不能使用//围绕模式 – 你必须使用匹配运算符~ (代字号)。

这适用于您的数据正确:

 a='2012/04/19' b='2012/04/22' awk -v A="$a" -v B="$b" '$0 ~ A, $0 ~ B' file.txt 

你不能把variables放在里面的原因是variables名称中的字符被看作是模式而不是variables的内容。