• ベストアンサー

bashでのif文内正規表現についての

bashでのif文内正規表現についての質問です。 IPアドレスを正規表現にてマッチングさせたいのですが実現できなく困っています。 たとえば192.168.1.の1から128を引っ掛けたいのですがどうすれば実現できますか? 今は下記のように書いていますが、これではだめみたいです。 ARCHKIP=`netstat -rn | awk '{ print $1 }'` for i in `echo $ARCHKIP` do if [[ $i = 192.168.1.[1-128] ]];then echo "OK" fi done わかる方お教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

文字クラスに誤解があると思います。[1-128] の文字クラスは、1から 128 までにマッチするのではなく、 1, 2, 8 のいずれかの文字にマッチします。- の両側に複数文字をを指定することはできません。次の 正規表現を試してみてください。(なお、見苦しくなるのでピリオドはエスケープしていません。) netstat -rn | awk '{ print $1 }' | grep -E "192.168.1.([1-9][0-9]?|1([01][0-9]|2[0-8]))$"

boonie777
質問者

お礼

回答ありがとうございました! 数式でなく文字列としてみなければならなかったんですね。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

詳しい説明をし出すときりがないですが、bashの機能では正規表現は使えません。 ファイルマッチ( ? が任意の一文字、* が任意の文字列、など)が使えます。これを使うと、 for i in $ARCHKIP do case $i in 192.168.1.[1-9]|192.168.1.[1-9][0-9]|192.168.1.1[01][0-9]|192.168.1.12[0-8]) echo OK ;; esac done あるいは、前半後半を分割して、 for i in $ARCHKIP do if [[ ${i:0:10} = 192.168.1. && ${i:10} -ge 1 && ${i:10} -le 128 ]] then echo OK fi done

boonie777
質問者

お礼

遅くなりましたが、丁寧にありがとうございました! 一行にまとまっててわかりやすいです。 すべては私の誤解、あらためて恥ずかしーです。

すると、全ての回答が全文表示されます。
  • mekanik
  • ベストアンサー率26% (4/15)
回答No.1

こんにちは。 bash で上記のような正規表現ができるかどうかは、わかりません。 しかし、 以下で同じことにはなりませんでしょうか? netstat -rn | awk '{ print $1 }' | grep "192.168.1.[1-128]"

boonie777
質問者

補足

回答ありがとうございます。 上記の実行結果では残念ながらだめでした。 netstat -rn | awk '{ print $1 }' | grep -E "192.168.1.[1-128]" でも192.168.1.192などが引っかかってしまうためNGなようなのです。

すると、全ての回答が全文表示されます。

関連するQ&A