2017-05-25 70 views
0

我正在創建一個腳本來分析一些文件並提供必要的信息。我該如何使用grep作爲貓

我在數組中設置了許多不同的變量,用於搜索文件中的不同方面。 例如日期,地點,類型。

但是我想讓每個變量都是可選的,這就是我遇到問題的地方。

命令的語法本來簡單 grep ${dates} filename | grep ${locations} | grep ${types}

但由於變量是可選的,上面不會有變量是否未設置工作。

我試圖找到一種方式來獲得grep來找到任何東西(即像egrep .* filename) 這樣,我可以設置變量以適當的正則表達式,並有命令仍然可以運行。

不幸的是,當我設置變量等於''時,它凍結,當我將它設置爲'。'它只是從當前目錄中的每個文件中刪除所有內容,當我將變量留空時,它將文件名作爲變量並等待文件名。

有無論如何,我可以設置一個變量,使grep $variable file輸出相同的貓會?

非常感謝提前!

回答

1

要獲得grep表現得像cat使用空字符串作爲搜索模式,即grep ""。因此,使一些可選的變量,但沒有管道grep小號失敗,只是引用變量:

grep "${dates}" filename | grep "${locations}" | grep "${types}" 

示範。搜索{250255260 ... 280}的數字,和:

x=5 y=2 z=7 ; seq 250 5 280 | grep "$x" | grep "$y" | grep "$z" 
275 

取消設置兩個變量,並且它仍然有效:

unset x y ; seq 250 5 280 | grep "$x" | grep "$y" | grep "$z" 
270 
275 
-1

你可以發佈源文件和目標輸出。從你的問題來看,你聽起來像只需要將grep -E與|一起使用管道分隔符。

grep -E "${dates}|${locations}|${types}" fileName 

,上面一行是自動獲取你的任何圖案的每次出現。這甚至不是一個正則表達式。

+0

你無需使用*擴展*正則表達式選項,只需'grep「$日期\ | $位置\ | $類型」文件名「是好的。(如果你需要擴展正則表達式,那麼當然,使用它,但如果沒有,基本的'grep'很好) –

+0

OP描述使用shell管道'|',而不是邏輯*或* s。比較'seq 10 5 50 | grep -E'2 | 5'',(查找* 2 * OR * 5 *)到'seq 10 5 50 | grep'5'| grep'2',(查找* 2 *和* 5 *)。 – agc

0

如果文件名中沒有任何$日期,則沒有任何內容可以輸入管道的其餘部分。

我認爲最好的辦法是分別爲每個字符串grep。

如果您得到一個匹配,然後grep爲下一個字符串。