2014-10-08 90 views
0

我有以下awk命令awk中多行匹配,打印文件名和匹配

awk -v RS=! -v ORS= '/abc/ && /def/ {print FILENAME;}' files 

這看起來在文件中的每個文件,通過該文件中的每條記錄分離,然後匹配記錄到'abc'和'def'。上面的代碼將打印文件的名稱。如果我刪除了{print FILENAME}它將打印整個記錄,如果匹配。

的文件看起來像:

abc1 
bce 
bcd 
def 
! 
abc2 
bce 
def 
! 

我想打印出來的文件名,符合「ABC」就行了。例如:

file1 
abc1 

file2 
abc2 
abc3 

我該怎麼辦?

+0

做類似的?你是否需要在你的示例awk腳本(對該腳本的修改)的上下文中完成此操作?或者像@ nu11p01n73R的答案是可以接受的? – 2014-10-08 19:13:05

回答

4
awk 'FNR==1{print FILENAME} /abc/' file1 file2 

FNR字段設置爲1一個新的文件被讀取。 FNR==1是真,則在每個輸入文件中,其中將要執行的動作的第一行是print FILENAME它將打印file1file2

/abc/將匹配含abc所有行,因爲沒有指定動作,默認被打印的整個記錄($0)。這是寫你想,如果沒有匹配的文件打印出來的文件名/abc/{print $0}

file1 
abc1 

file2 
abc2 
abc3 
2
awk 'FNR==1{fname=FILENAME"\n"} /abc/{printf "%s%s\n", (fname?fname:""), $0; fname=""}' files