请咨询我的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的内容。