2016-06-22 13 views
1

私はこのスクリプトを使って4パターンを求めてからgrepコマンドで使用します。つまり、ある行がどのパターンにも一致するかどうかを確認したいのです。grepコマンドに空の文字列を渡す

echo -n "Enter pattern1" 
read pat1 
echo -n "Enter pattern2" 
read pat2 
echo -n "Enter pattern3" 
read pat3 
echo -n "Enter pattern4" 
read pat4 

cat somefile.txt | grep $pat1 | grep $pat2 | grep $pat3 | grep $pat4 

私が遭遇している問題は、ユーザがパターン(許可したいパターン)の1つを供給しないと、grepコマンドが機能しないということです。

grepに空白が返ってきた場合、パターンの1つを無視する方法はありますか?

+0

@fedorqu - 私は重複した質問をするために謝罪。これまでに痛みを伴わないことが分かっていれば、私はこれを初めて知りました。 – berserker

+0

@berserker ANDまたはORでフィルタリングしますか? grepを別のgrepにパイプすると、最初の結果がフィルタリングされます。 'pat = $ {pat: - " "}'と指定すると、空のコンテンツは '' ''に置き換えられ、 '' grep "$ pat" 'は動作します。 。 – fedorqui

+0

@fedorqu - ORでフィルタリングしたい。基本的には、私はsyslogの検索を行い、srcとdst ipとsrcとdst portの入力を取っています。私は、4つの入力すべて、またはそれらのいずれかの組み合わせで検索を実行したい。 – berserker

答えて

3

あなたのコードでは、多くの問題があります:echo -nを使用して、潜在的に使用されていない情報

  • を求め

    • コードの重複
    • インタラクティブは、ここで猫

    のポータブル

  • 無用の使用ではありませんあなたが代わりに使うべきものに近い私が書いたものです:

    i=1 
    printf %s "Enter pattern $i: " 
    read -r input 
    while [[ $input ]]; do 
        pattern+=(-e "$input") 
        let i++ 
        printf %s "Enter pattern $i (Enter or Ctrl+D to stop entering patterns): " 
        read -r input 
    done 
    echo 
    grep "${pattern[@]}" somefile.txt 
    

    EDIT:これはここ

    が働いANDソリューションです...これは代わりにANDORで複数のパターンを検索し、OPの質問に答えていない(それは上のパターンの入力を求める停止します最初の空1もしくは第四1の後):ここでは

    pattern= 
    for i in {1..4}; do 
        printf %s "Enter pattern $i: " 
        read -r input 
        [[ $input ]] || break 
        pattern="${pattern:+"$pattern && "}/${input//\//\\/}/" 
    done 
    echo # skip a line 
    awk "$pattern" somefile.txt 
    

    あなたはbashでプログラムする方法を学ぶことができ、そこからいくつかのリンクです:

  • +0

    また、C構文のループを使用して、 'for((i = 1; i <= 5; i ++));と言うこともできます。行う ...; 'let'を使用する代わりに' done'を実行します([bashスクリプトで数値を追加するにはどうすればいいですか?](http://stackoverflow.com/a/6348941/1983854も参照)。アレイトリック+1。入力がない場合は 'input = $ {input: - " "}'と言うことができます。 – fedorqui

    関連する問題