2013-11-25 66 views
0

我試圖搜索跨所有行的模式的所有文件,然後返回匹配模式的文件名列表。如何在UNIX中查找具有多行模式的文件?

我使用這行:

find . -name "$file_to_check" 2>/dir1/null | xargs grep "$2" >> $grep_out 

這將創建一個文件列表,並匹配模式$ grep_out內上找到的線。這個問題是,搜索不能跨越多行。我讀過grep不能跨越多行,所以我打算用sed或awk替換grep。

我認爲需要改變的唯一事情就是grep。我發現grep無法跨多行搜索模式,所以我正在尋找使用sed或awk。當我從終端使用這些命令時,我得到了一個與我給sed的模式匹配的大文件。我想要的只是文件名,而不是模式的上下文。有沒有辦法檢索這個 - 也許有sed打印出文件名而不是上下文?或者,sed在找到匹配項時返回true/false,然後我可以保存用於執行搜索的當前文件名。

+0

是什麼搜索模式的一些例子嗎?這些模式中是否有新行? – anubhava

回答

1

我試圖搜索跨所有行的模式的所有文件,然後返回匹配模式的文件名列表。

pattern=$(echo "whatever your search pattern is" | tr '\n' ' ') 

for FILE in * 
do 
    tr '\n' ' ' <"$FILE" | if grep "$pattern" then; echo $FILE; fi 
done 

只需更換新行的空間無論是在你的方式和你的grep輸入

隨着「發現」,你可以做這樣的:

#!/bin/bash 

find . -name "$file_to_check" 2>/dir1/null | while read FILE 
do 
    tr '\n' ' ' <"$FILE" | if grep -q "word1.*word2.*word3" ; then echo "$FILE" ; fi 
done >grep_out 

至於搜模式:「。*「表示‘任意字符的任意量’

請記住,在grep的一個是searchPattern總是希望有一定的轉義字符,如」。」變爲‘\’和‘^’變成‘\ ^’

+0

我怎樣才能用我的「查找」命令?更具體地說,我怎樣才能用這個管道? – user1472747

+0

查看更新的答案 – thom

+0

謝謝。我將如何編寫模式?我在找他們之間的任何東西,包括換行符的3個單詞。 – user1472747

3

大多數文本處理工具默認是面向行的。如果我們選擇閱讀記錄作爲段落,使用空行作爲記錄分隔符:

awk -v RS= -v pattern="$2" '$0 ~ pattern {print FILENAME; exit}' file 

find . -options ... -print0 | xargs -0 awk -v RS= -v pattern="$2" '$0 ~ pattern {print FILENAME; exit}' 

我假設你的模式不包含連續的換行符(即空行)


要檢查文件是否包含 「字1 [任何] WORD2 [什麼] WORD3」

  1. 蠻力:讀取整個文件,然後,以一個正則表達式的比較:使用bash

    contents=$(< "$file") 
    if [[ $contents =~ "$word1".*"$word2".*"$word3" ]]; then 
        echo "match" 
    else 
        echo "no match" 
    fi 
    

2.行由符合AWK,使用狀態機

awk -v w1="$word1" -v w2="$word2" -v w3="$word3" ' 
     $0 ~ w1   {have_w1 = 1} 
     have_w1 && $0 ~ w2 {have_w2 = 1} 
     have_w2 && $0 ~ w3 {have_w3 = 1; exit} 
     END    {exit (! have_w3)} 
    ' filename 

啊,罷工#2:將匹配線 「word3word2word1」 - 不強制單詞的順序

+0

它不包含連續的換行符。雖然我還有另一個問題給你 - 我如何使用awk搜索3個在它們之間有任何內容的單詞?模式爲:awk「word1 [anything] word2 [anything] word3」filename其中[任何內容]可以是任意數量的任何字符,包括換行符 – user1472747

+0

如何合併暴力破解代碼?我會使用您指定的awk行上面,並把蠻力代碼放在大括號內? – user1472747

+0

不,這是bash代碼。 –

相關問題