2016-11-04 4 views
0

私は、次の機能を持っている:シェル関数の引数に基づいて条件付きgrepを実行するには?

function long_command() { 
    cat $1 | grep -vE '[a-fA-F0-9]{5}' | \ 
    cat -n | sed -e 's/ //g' | \ 
    sed -e 's/^ *//g' | \ 
    sort -k 3,3 -k 1n,1n | \ 
    uniq -f 2 | \ 
    sed -e 's/^[0-9]\{1,\} //' | \ 
    grep -Ev '^\s*PATTERN\s+' | \ 
    cat -n 
} 

コマンドの最初の部分は、いくつかのものをフィルタリングします。コマンドの最後の部分では、最後にcat -nにパイプする前に、$2が設定されていて、それがVALUEと等しいとする場合にのみ、grep -Ev '^\s*PATTERN\s+'を使用してフィルタリングしたいと思います。どうやってやるの?

これは動作しません:

function long_command() { 
    cat $1 | grep -vE '[a-fA-F0-9]{5}' | \ 
    cat -n | sed -e 's/ //g' | \ 
    sed -e 's/^ *//g' | \ 
    sort -k 3,3 -k 1n,1n | \ 
    uniq -f 2 | \ 
    sed -e 's/^[0-9]\{1,\} //' | \ 
    if [ "$2" -eq "VALUE" ]; then grep -Ev '^\s*PATTERN\s+'; fi | \ 
    cat -n 
} 

私はエラーを取得する:

-bash: [: : integer expression expected 

場合にcat -nの場合、パイプの結果を使用するWhat't正しい方法?

ご注意いただきありがとうございます。

+0

あなたが効率的にコマンドラインユーティリティを使用する方法を学習する必要があります。そのパイプは1つまたは2つのコマンドに単純化することができます。関連する入力データと予想される出力を追加すると、どのように表示することができますか – hek2mgl

答えて

1

パイプラインコマンドに表示されているようなif/elseは、elseの部分には何もないので使用できません。また、-eqには整数比較が必要です。

あなたはこのようにそれを行うことができます。

long_command() { 
    grep -vE '[a-fA-F0-9]{5}' "$1" | 
    cat -n | 
    sed 's/ //g' | 
    sed 's/^ *//g' | 
    sort -k 3,3 -k 1n,1n | 
    uniq -f 2 | 
    sed 's/^[0-9]\{1,\} //' | 
    { [[ $2 == "VALUE" ]] && grep -Ev '^\s*PATTERN\s+' || cat; } | cat -n 
} 

私は開始時に冗長catを削除したし、新しい行に次のコマンドを入力すること|\を使用する必要はありません。

最後のパイプの後、あなたはまた、使用することができます。

if [[ "$2" == "VALUE" ]]; then grep -Ev '^\s*PATTERN\s+'; else cat; fi 
+2

'パイプラインコマンドでif/elseを使用できません '。 if側とelse側の両方でデータが正しく流れていることを確認するだけです。この場合、それは '[[" $ 2 "==" VALUE "]]となります。 grep -Ev '^ \ s *パターン\ s +';そうでなければ猫。 fi' – anishsane

+0

おかげさまで@anishsane、非常に参考になりました(編集済み)。 – anubhava

+0

この回答はコマンドラインの自殺をコミットするための助けとなります。このように答えるべきではありません。実際の問題はパイプの複雑さです。パイプをクリーンアップする必要がありますが、質問には関連する入力データがありません。 – hek2mgl

関連する問題