2017-02-28 60 views
-2

我想創建一個bash腳本來使用grep來搜索具有多種模式(不區分大小寫)的行。我想按照以下步驟創建一個bash腳本,我可以使用:使用grep搜索多個模式的函數

myscript file.txt pattern1 pattern2 pattern3 

,它應該得到traslated到:

grep -i --color=always pattern1 file.txt | grep -i pattern2 | grep -i pattern3 

我嘗試以下bash腳本,但它不工作:

#!/bin/bash 
grep -i --color=always $2 $1 | grep -i $3 | grep -i $4 | grep -i $5 | grep -i $6 | grep -i $7 

的錯誤是:

Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
+0

但是,什麼是這樣做的目的是什麼? –

+0

你想* undefined *模式的數量? –

+0

是的。 bash腳本應該能夠以第一個文件名參數運行,然後運行可變數量的模式參數(應該能夠處理至少6個模式 - 理想情況下任意數量)。 – rnso

回答

1

我覺得你可以做一個遞歸函數:

search() { 
    if [ $# -gt 0 ]; then 
     local pat=$1 
     shift 
     grep "$pat" | search "[email protected]" 
    else 
     cat 
    fi 
} 

在你的腳本,你會調用這個函數,並通過搜索模式作爲參數。都說$1是文件的參數其餘的模式,那麼你會怎麼做

file=$1 
shift 
cat "$file" | search "[email protected]" 
+0

如何在bash腳本中使用搜索功能。 – rnso

+0

@rnso我編輯顯示用法。 –

+0

如果沒有輸入或只輸入1個參數,是否可以顯示錯誤消息? – rnso

-1

如果省略一個參數或其他底,使得$ 3等將被丟失,那麼一些grep命令會沒有收到一個論點,會發牢騷。

1

當你有GNU AWK,您可以使用

awk 'BEGIN {IGNORECASE=1} /pattern1/ && /pattern2/ && /pattern3/' file.txt 

編輯: 您可以在這樣的腳本中使用此:

inputfile="$1" 
shift 
awk -f <(echo "BEGIN {IGNORECASE=1}"; printf " /%s/ &&" $* | sed 's/&&$//') "${inputfile}" 
+0

「awk」BEGIN {IGNORECASE = 1}/$ 2/&&/$ 3/&&/$ 4 /'$ 1「在bash腳本中不起作用。還有,如果只發送2個模式呢?我希望它能處理可能發送的可變數量的模式。 – rnso

+0

我編輯了答案,以顯示haw如何在具有可變數量參數的腳本中處理此問題。 –