2016-09-02 11 views
2

I持って次のように細かい実行するコマンド:それは基本的に数が今162次のコマンドで、bash変数をGREP正規表現にパイプする方法はありますか?

あるものを除いて、「数、162」のようなパターンを持っている行を探している

grep ",162$" xyz.txt | grep -v "^162,162$" 

、I 162は

grep ",$159" xyz.txt | grep -v "^159,159$" 
grep ",$111" xyz.txt | grep -v "^111,111$" 

のような他の数字に置き換えている多くのそのようなコマンドを実行します。..ので、同じ番号はどこにでもコマンドのすべての部分に表示される場所にしたいと思います。だから、私は値を変更するために1つの場所が必要であり、コマンドの残りの部分は必要なときにその値を取ることができます。

私は別の番号

x=162 | grep ",\$x$" xyz.txt | grep -v "^\$x,\$x$" 

をしようとするが、それは動作しませんしたいときに実行する必要がある変更の数を繰り返すために、このような何かをやってみました。私は数値の値を変更する必要があるたびに、私はコマンドの最初の位置に移動し、xの値だけを変更するように、私はどのような変更を行う必要がありますか?

+0

すべてのケースで異なる出力が必要ですか?つまり、grepをしたいのですか?$ 159 "xyz.txt | grep -v "^ var、var $" '多くのvarsに対して、個別に? – fedorqui

+0

いいえ、xの値はgrepの一部です。そして、xの前後にカンマをつけた行を削除します。 –

+0

@fedorqui私のコメントを追加したばかりの質問を編集しました。それはすべてのパイプコマンドに同じ番号です。 –

答えて

1

私はcorrectclyそれを理解していれば、あなたがそのような何かしたい:

x=162 
grep ",$x\$" xyz.txt | grep -v "^$x,$x\$" 
+0

今しよう。私は –

+0

おかげで試してみましょう。完璧に動作し、私が持っていたマイナーなバグを正しく修正します。 –

3

あなたはgrepのにはgrepをパイプしているときはいつでも、awkを使用して検討した:

var=YOUR_NUM 
awk -F, -v pat="$var" '$NF==pat && $1!=pat' file 

これはawk年代に少しを果たしていますfields:カンマにフィールドセパレータを設定すると、各パートを別々に扱うことができます。
最後のフィールドが指定された値で、最初のフィールドが指定されていないケースと一致させたいとします。これは、最後のフィールドに$NFを使用し、最初のフィールドに$1を使用することで可能です。
また、NF(フィールド数)をチェックして条件を!($1==pat && NF==2) && $NF==patとすると、162,162,162のような行が印刷され、コントロールの余分なレイヤーを追加できます。しかし、これは本当にあなたがしたいことにかかっています。例えば

$ cat file 
hello 
hello,162 
162,162 
$ val=162 
$ awk -F, -v pat="$val" '$NF==pat && $1!=pat' file 
hello,162 

その後、それはあなたが望む値で$varを変更するだけです。あなたはワンライナーを意図している場合、引用

+1

もしOPが数値比較の代わりにregexpsを使う必要があると感じたら、awk -vx = "$ val"($ 0〜 "、" x "$")&&!($ 0〜 "^ "x"、 "x" $ ") 'file' –

1

はあなたの友達です:

X=123 /bin/sh -c 'grep ","$X"$" xyz.txt | grep -v "^"$X","$X"$"' 
1

シングルgrepコマンドは否定後読みで使用することができます:変数を渡す

$ cat xyz.txt 
12,12 
112,12 
1,12 
42,12 

$ grep -P '(?<!^12),12$' xyz.txt 
112,12 
1,12 
42,12 

はトリッキー

$ x=12 
$ grep -P "(?<!"^$x"),"$x"$" xyz.txt 
112,12 
1,12 
42,12 
です
関連する問題