Linux

awk + perl + 在 awk 語法中獲取兩個參數

  • April 19, 2012

請告知我的 awk 語法有什麼問題以及如何修復它(此語法在我的 ksh 腳本中),我在 linux 機器上執行我的腳本

我的目標是從 file.txt 中僅獲取日期之間的行:

2012 年 4 月 19 日2012 年 4 月 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():

你可以使用這個命令:

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

轉義斜線可以使用 donesed命令,例如:

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

然後,您可以aa代替a. 同樣,它可以為b.

引用自:https://serverfault.com/questions/380996